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 über die Direct3D-Pipeline zugegriffen werden kann. 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 beides zugänglich machen. Für jede Pipelinephase können bis zu 128 Ressourcen aktiv sein.

Direct3D garantiert, dass 0 (null) für alle Ressourcen zurückgegeben wird, auf die außerhalb der Grenzen zugegriffen 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 Speicherbedarf) einer Ressource vollständig anzugeben:

  • Typisiert: 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.

Durch das Erstellen einer vollständig typisierten Ressource wird die Ressource auf das Format beschränkt, mit dem sie erstellt wurde. Dadurch kann die Laufzeit den Zugriff optimieren, insbesondere wenn die Ressource mit Flags erstellt wird, die angeben, dass sie nicht von der Anwendung zugeordnet werden kann. Ressourcen, die mit einem bestimmten Typ erstellt wurden, können nicht mithilfe des Sichtmechanismus neu interpretiert werden, es sei denn, die Ressource wurde mit dem D3D10 _ DDI _ BIND _ PRESENT-Flag erstellt. Wenn D3D10 _ DDI _ BIND PRESENT festgelegt _ ist, können render-target- oder shader-Ressourcenansichten für diese Ressourcen mit einem der vollständig typisierten Member der entsprechenden Familie erstellt werden, auch wenn die ursprüngliche Ressource als vollständig typisiert erstellt wurde.

In einem Typ ohne Ressource ist der Datentyp unbekannt, wenn die Ressource zum ersten Mal erstellt wird. Die Anwendung muss aus den verfügbaren Typen ohne Formate auswählen (siehe DXGI _ FORMAT). Sie müssen die Größe des zuzuordnenden 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 Ressourcenansichtan 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 wiederverwendet oder in einem anderen Format 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 Pipelinestufen gebunden werden, solange jede über eine eindeutige Ansicht verfügt, die die Formate an jedem Speicherort vollständig qualifiziert. Beispielsweise kann eine Ressource, die mit dem Format DXGI _ FORMAT _ R32G32B32A32 TYPELESS erstellt _ wurde, als DXGI _ FORMAT _ R32G32B32A32 _ FLOAT und als DXGI FORMAT _ _ R32G32B32A32 _ UINT an verschiedenen Stellen in der Pipeline gleichzeitig verwendet werden.

Ressourcenansichten

Ressourcen können in allgemeinen Speicherformaten gespeichert werden, sodass sie von mehreren Pipelinestufen 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 können.

Eine Sicht 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 derselben Familie entsprechen wie das typlose Format, das beim Erstellen der Ressource verwendet wird. Beispielsweise kann eine Ressource, die mit dem TYPELESS-Format R8G8B8A8 erstellt wurde, _ nicht als R32 FLOAT-Ressource angezeigt werden, _ obwohl beide Formate die gleiche Größe im Arbeitsspeicher aufweisen können.

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

Ressourcenschnittstelle Beschreibung
ID3D11DepthStencilView Greifen Sie während der Tiefenschablonentests auf eine Texturressource zu.
ID3D11RenderTargetView Greifen Sie auf eine Texturressource zu, die als Renderziel verwendet wird.
ID3D11ShaderResourceView Greifen Sie auf eine Shaderressource zu, z. B. einen Konstantenpuffer, einen Texturpuffer, eine Textur oder einen Sampler.
ID3D11UnorderedAccessView Greifen Sie mit einem Pixel-Shader oder einem Compute-Shader auf eine ungeordnete Ressource zu.

Rohdatenansichten von Puffern

Sie können sich einen unformatierten Puffer vorstellen, der auch als Byteadrespufferbezeichnet werden kann, als einen Behälter von Bits, auf die Sie unformatierten Zugriff benötigen, 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 unformatierten 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 Objekttypen HLSL ByteAddressBuffer und RWByteAddressBuffer verwenden, wenn Sie mit Rohpuffern arbeiten.

Um eine rohe Ansicht 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 Flag D3D11 _ RESOURCE _ MISC _ BUFFER ALLOW _ _ RAW _ VIEWS nicht mit der D3D11-RESSOURCE _ _ MISC BUFFER _ _ STRUCTUREDkombinieren. Wenn Sie außerdem D3D11 _ BIND CONSTANT _ _ BUFFER in BindFlags von 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 von rohen Sichten, da konstante Puffer bereits über eine Einschränkung verfügen, 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 (MISC _ BUFFER ALLOW RAW _ _ _ VIEWS)nicht in bezug auf die Funktionalität eingeschränkt, anstatt D3D11 RESOURCE _ MISC BUFFER ALLOW RAW VIEWS (D3D11-RESSOURCEN-MISC-PUFFER _ ALLOW RAW _ _ _ _ VIEWS) nicht festzulegen. Das heißt, Sie können einen solchen Puffer für nicht unformatierten Zugriff auf eine beliebige Anzahl von Möglichkeiten 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