Direct2D DXGI-Oberfläche kann nicht erstellt werden

  • Ich rufe diese Methode auf:

    http://msdn.microsoft.com/de-de/library/dd371264 (VS.85) .aspx

    Der Aufruf schlägt mit E_NOINTERFACE fehl. Die Dokumentation ist besonders wenig hilfreich, warum dies passieren kann. Ich habe alle DirectX 11-Debugging-Funktionen aktiviert und das ist das Beste, was ich habe. Ich weiß, dass ich eine gültige IDXGISurface1* habe (auch versucht IDXGISurface) und die anderen Parameter richtig eingestellt sind. Irgendwelche Ideen, warum dieser Aufruf fehlschlagen kann?

    Bearbeiten:

    Ich habe auch Probleme beim Erstellen von D3D11-Geräten. Wenn ich nullptr als IDXGIAdapter * -Argument in D3D11CreateDeviceAndSwapChain übergeben, funktioniert es einwandfrei, aber wenn ich die Adapter selbst aufzähle und einen Zeiger übergebe (der einzige, der zurückgegeben wird), schlägt das ungültige Argument fehl. Die MSDN-Dokumentation besagt explizit, dass das System bei der Übergabe von nullptr die erste Rückgabe von EnumAdapters1 verwendet. Ich verwende ein DX11-System.

    20 December 2010
    Puppy
2 answers
  • Direct2D funktioniert nur, wenn Sie ein Direct3D 10.1-Gerät erstellen, kann jedoch Oberflächen mit Direct3D 11 gemeinsam nutzen. Sie müssen lediglich beide Geräte erstellen und alle Ihre Direct2D-Inhalte darstellen eine Textur, die Sie miteinander teilen. Ich verwende diese Technik in meinen eigenen Anwendungen, um Direct2D mit Direct3D 11 zu verwenden. Sie verursacht geringe Kosten, ist aber pro Frame klein und konstant.

    Eine grundlegende Übersicht über den Prozess, den Sie durchführen Dazu müssen Sie Folgendes verwenden:

    1. Erstellen Sie Ihr Direct3D 11-Gerät wie gewohnt.
    2. Erstellen Sie eine Textur mit der D3D10_RESOURCE_MISC_SHARED_KEYEDMUTEX-Option, um den Zugriff auf die ID3D11KeyedMutex-Schnittstelle zu ermöglichen.
    3. Verwenden Sie die GetSharedHandle , um einen Überblick über die Textur zu erhalten, die von Geräten gemeinsam genutzt werden kann.
    4. Erstellen Sie ein Direct3D 10.1 Das Gerät muss auf demselben Adapter erstellt werden.
    5. Verwenden Sie die OpenSharedResource-Funktion auf dem Direct3D 10.1-Gerät, um eine Version der Textur für Direct3D 10.1 abzurufen.
    6. Erhalten Sie Zugriff auf die D3D10 KeyedMutex-Schnittstelle für die Textur.
    7. Verwenden Sie die Direct3D 10.1-Version der Textur, um das Rend zu erstellen erTarget mit Direct2D.
    8. Wenn Sie mit D2D rendern möchten, sperren Sie die Textur für das D3D10-Gerät mit dem codierten Mutex. Erwerben Sie es dann in D3D11 und rendern Sie die Textur so, wie Sie es wahrscheinlich bereits versucht haben.

    Es ist nicht trivial, aber es funktioniert gut ist die Art und Weise, wie sie beabsichtigten, zwischen ihnen zu interagieren. Windows 8 sieht so aus, als würde es die volle D3D11-Kompatibilität einführen, so dass es genauso einfach ist, wie Sie es erwarten.

    31 January 2012
    zhuman - MSFT
  • Direct2D verwendet D3D10-Geräte und nicht D3D11-Geräte. Das D3D11-Gerät wird wahrscheinlich von diesem E_NOINTERFACE als fehlendes Interface gemeldet

    20 December 2010
    Öö Tiib