Einführung in eine Ressource in Direct3D 11

Ressourcen sind die Bausteine Ihrer Szene. Sie enthalten die meisten Daten, die Direct3D zum Interpretieren und Rendern Ihrer Szene verwendet. Ressourcen sind Bereiche im Arbeitsspeicher, auf die die Direct3D-Pipeline zugreift. Ressourcen enthalten die folgenden Datentypen: Geometrie, Texturen, Shaderdaten. In diesem Thema werden Direct3D-Ressourcen wie Puffer und Texturen vorgestellt.

Sie können Ressourcen erstellen, die stark typisiert oder typlos sind. Sie können steuern, ob Ressourcen sowohl Lese- als auch Schreibzugriff haben. Sie können Ressourcen nur für die CPU, GPU oder beide zugänglich machen. Für jede Pipelinephase können bis zu 128 Ressourcen aktiv sein.

Direct3D garantiert, dass für jede Ressource, auf die außerhalb der Grenzen zugegriffen wird, null zurückgegeben wird.

Der Lebenszyklus einer Direct3D-Ressource lautet:

Dieser Abschnitt enthält die folgenden Themen:

Starke und schwache Typisierung

Es gibt zwei Möglichkeiten, das Layout (oder den Arbeitsspeicherbedarf) einer Ressource vollständig anzugeben:

  • Typ: Geben Sie den Typ beim Erstellen der Ressource vollständig an.
  • Typlos: Geben Sie den Typ vollständig an, wenn die Ressource an die Pipeline gebunden ist.

Beim Erstellen einer vollständig typisierten Ressource wird die Ressource auf das Format beschränkt, mit dem sie erstellt wurde. Dadurch kann die Runtime den Zugriff optimieren, insbesondere wenn die Ressource mit Flags erstellt wird, die angeben, dass sie von der Anwendung nicht zugeordnet werden kann. Ressourcen, die mit einem bestimmten Typ erstellt wurden, können nicht mithilfe des Ansichtsmechanismus neu interpretiert werden, es sei denn, die Ressource wurde mit dem flag D3D10_DDI_BIND_PRESENT erstellt. Wenn D3D10_DDI_BIND_PRESENT festgelegt ist, können Renderziel- oder Shaderressourcensichten für diese Ressourcen mithilfe eines der vollständig typisierten Member der entsprechenden Familie erstellt werden, auch wenn die ursprüngliche Ressource als vollständig typisiert erstellt wurde.

Bei einer Ressource vom Typ "weniger" ist der Datentyp unbekannt, wenn die Ressource zum ersten Mal erstellt wird. Die Anwendung muss aus den verfügbaren Typen mit weniger Formaten wählen (siehe DXGI_FORMAT). Sie müssen die Größe des zu zuweisenden Arbeitsspeichers angeben und angeben, ob die Runtime die Untertexturen in einer mipmap generieren muss. Das genaue Datenformat (ob der Arbeitsspeicher als ganze Zahlen, Gleitkommawerte, ganze Zahlen ohne Vorzeichen usw.) interpretiert wird, wird jedoch erst bestimmt, wenn die Ressource mit einer Ressourcensicht an die Pipeline gebunden ist. Da das Texturformat flexibel bleibt, bis die Textur an die Pipeline gebunden ist, wird die Ressource als schwach typisierter Speicher bezeichnet. Schwach typisierter Speicher hat den Vorteil, dass er in einem anderen Format wiederverwendet oder neu interpretiert werden kann, solange die Anzahl der Komponenten und die Bitanzahl jeder Komponente in beiden Formaten identisch sind.

Eine einzelne Ressource kann an mehrere Pipelinephasen gebunden werden, solange jede eine eindeutige Ansicht hat, die die Formate an jedem Standort vollständig qualifiziert. Beispielsweise kann eine Ressource, die mit dem Format DXGI_FORMAT_R32G32B32A32_TYPELESS erstellt wurde, gleichzeitig als DXGI_FORMAT_R32G32B32A32_FLOAT und DXGI_FORMAT_R32G32B32A32_UINT an verschiedenen Stellen in der Pipeline verwendet werden.

Ressourcenansichten

Ressourcen können in universellen Speicherformaten gespeichert werden, sodass sie von mehreren Pipelinephasen gemeinsam genutzt werden können. Eine Pipelinephase interpretiert Ressourcendaten mithilfe einer Sicht. Eine Ressourcenansicht ähnelt konzeptionell der Umwandlung der Ressourcendaten, sodass sie in einem bestimmten Kontext verwendet werden kann.

Eine Ansicht kann mit einer typlosen Ressource verwendet werden. Das heißt, Sie können eine Ressource zur Kompilierzeit erstellen und den Datentyp deklarieren, wenn die Ressource an die Pipeline gebunden ist. Eine Ansicht, die für eine typlose Ressource erstellt wurde, weist immer die gleiche Anzahl von Bits pro Komponente auf. die Art und Weise, wie die Daten interpretiert werden, hängt vom angegebenen Format ab. Das angegebene Format muss aus derselben Familie wie das typlose Format stammen, das beim Erstellen der Ressource verwendet wird. Beispielsweise kann eine Ressource, die mit dem R8G8B8A8_TYPELESS-Format erstellt wurde, nicht als R32_FLOAT-Ressource angezeigt werden, obwohl beide Formate möglicherweise die gleiche Größe im Arbeitsspeicher aufweisen.

Eine Ansicht macht auch andere Funktionen verfügbar, z. B. die Möglichkeit, Tiefen-/Schablonenflächen in einem Shader zurückzulesen, eine dynamische Cubemap in einem einzigen Durchlauf zu generieren und gleichzeitig in mehreren Slices eines Volumes zu rendern.

Ressourcenschnittstelle Beschreibung
ID3D11DepthStencilView Greifen Sie während des Tiefenschablonentests auf eine Texturressource zu.
ID3D11RenderTargetView Greifen Sie auf eine Texturressource zu, die als Renderziel verwendet wird.
ID3D11ShaderResourceView Greifen Sie auf eine Shaderressource wie einen Konstantenpuffer, einen Texturpuffer, eine Textur oder einen Sampler zu.
ID3D11UnorderedAccessView Greifen Sie mithilfe eines Pixel-Shaders oder eines Compute-Shaders auf eine nicht sortierte Ressource zu.

 

Rohansichten von Puffern

Sie können sich einen Rohdatenpuffer vorstellen, der auch als Byteadresspuffer bezeichnet werden kann, als eine Tüte von Bits, auf die Sie rohen Zugriff haben möchten, d. h. einen Puffer, auf den Sie bequem über Blöcke mit einem bis vier typlosen 32-Bit-Adresswerten zugreifen können. Sie geben an, dass Sie rohen Zugriff auf einen Puffer (oder eine rohe Ansicht eines Puffers) wünschen, wenn Sie eine der folgenden Methoden aufrufen, um eine Ansicht für den Puffer zu erstellen:

Sie können die HLSL-Objekttypen ByteAddressBuffer und RWByteAddressBuffer verwenden, wenn Sie mit Rohdatenpuffern arbeiten.

Um eine Rohansicht für einen Puffer zu erstellen, müssen Sie zuerst ID3D11Device::CreateBuffer mit dem D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS-Flag aufrufen, um die zugrunde liegende Pufferressource zu erstellen. Sie geben dieses Flag im MiscFlags-Member der D3D11_BUFFER_DESC-Struktur an, auf die der pDesc-Parameter von ID3D11Device::CreateBuffer verweist. Sie können das D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS-Flag nicht mit D3D11_RESOURCE_MISC_BUFFER_STRUCTURED kombinieren. Wenn Sie auch D3D11_BIND_CONSTANT_BUFFER in BindFlags of D3D11_BUFFER_DESC angeben, können Sie nicht auch D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS in MiscFlags angeben. Dies ist keine Einschränkung nur für rohe Ansichten, da konstanten Puffer bereits eine Einschränkung aufweisen, die nicht mit einer anderen Ansicht kombiniert werden kann.

Abgesehen von den vorherigen ungültigen Fällen sind Sie beim Erstellen eines Puffers mit D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS nicht in der Funktionalität eingeschränkt, anstatt D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS festzulegen. Das heißt, Sie können einen solchen Puffer für den Nicht-Rohdatenzugriff auf verschiedene Arten verwenden, die mit Direct3D möglich sind. Wenn Sie das flag D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS angeben, erhöhen Sie nur die verfügbare Funktionalität.

Ressourcen

Neue Ressourcentypen