Einführung in Texturen in Direct3D 11
Eine Texturressource ist eine strukturierte Sammlung von Daten, die zum Speichern von Texels entwickelt wurden. Ein Texel stellt die kleinste Einheit einer Textur dar, die von der Pipeline gelesen oder geschrieben werden kann. Im Gegensatz zu Puffern können Texturen nach Textur-Samplern gefiltert werden, da sie von Shadereinheiten gelesen werden. Der Texturtyp wirkt sich auf die Filterung der Textur aus. Jedes Texel enthält 1 bis 4 Komponenten, die in einem der DXGI-Formate angeordnet sind, die durch die DXGI_FORMAT-Enumeration definiert sind.
Texturen werden als strukturierte Ressource mit einer bekannten Größe erstellt. Jede Textur kann jedoch typisiert oder typlos sein, wenn die Ressource erstellt wird, solange der Typ vollständig mithilfe einer Ansicht angegeben wird, wenn die Textur an die Pipeline gebunden ist.
Texturtypen
Es gibt mehrere Arten von Texturen: 1D, 2D, 3D, von denen jede mit oder ohne Mipmaps erstellt werden kann. Direct3D 11 unterstützt auch Texturarrays und multisampled Texturen.
1D-Texturen
Eine 1D-Textur in ihrer einfachsten Form enthält Texturdaten, die mit einer einzelnen Texturkoordinate adressiert werden können. es kann als Array von Texels visualisiert werden, wie in der folgenden Abbildung gezeigt. 1D-Texturen werden durch die ID3D11Texture1D-Schnittstelle dargestellt.
Jedes Texel enthält je nach Format der gespeicherten Daten eine Reihe von Farbkomponenten. Durch die zusätzliche Komplexität können Sie eine 1D-Textur mit Mipmap-Ebenen erstellen, wie in der folgenden Abbildung gezeigt.
Eine Mipmap-Ebene ist eine Textur, die kleiner als die Darüberebene ist. Die oberste Ebene enthält die meisten Details, jede nachfolgende Ebene ist kleiner. Bei einer 1D-Mipmap enthält die kleinste Ebene ein Texel. Darüber hinaus verringern sich die MIP-Werte immer auf 1:1. Wenn Mipmaps für eine Textur mit ungeradem Format generiert werden, ist die nächstniedrige Ebene immer gerade Größe (außer wenn die niedrigste Ebene 1 erreicht). Das Diagramm zeigt beispielsweise eine 5x1-Textur, deren nächstniedrigste Ebene eine 2x1-Textur ist, deren nächste (und letzte) Mip-Ebene eine Textur der Größe 1x1 ist. Die Ebenen werden durch einen Index identifiziert, der als LOD (Level of Detail) bezeichnet wird, der verwendet wird, um auf die kleinere Textur zuzugreifen, wenn Geometrie gerendert wird, die nicht so nah an der Kamera liegt.
1D-Texturarrays
Direct3D 11 unterstützt auch Arrays von Texturen. Ein 1D-Texturarray wird auch durch die ID3D11Texture1D-Schnittstelle dargestellt. Ein Array von 1D-Texturen sieht konzeptionell wie in der folgenden Abbildung aus.
Dieses Texturarray enthält drei Texturen. Jede der drei Texturen hat eine Texturbreite von 5 (dies ist die Anzahl der Elemente in der ersten Ebene). Jede Textur enthält auch eine Mipmap mit drei Ebenen.
Alle Texturarrays in Direct3D sind ein homogenes Array von Texturen. Dies bedeutet, dass jede Textur in einem Texturarray das gleiche Datenformat und die gleiche Größe aufweisen muss (einschließlich Texturbreite und Anzahl von Mipmap-Ebenen). Sie können Texturarrays unterschiedlicher Größe erstellen, sofern alle Texturen in den einzelnen Arrays in ihrer Größe übereinstimmen.
2D-Texturen und 2D-Texturarrays
Eine Textur2D-Ressource enthält ein 2D-Raster aus Texeln. Jedes Texel kann durch einen u-, v-Vektor adressiert werden. Da es sich um eine Texturressource handelt, kann sie Mipmapebenen und Unterressourcen enthalten. 2D-Texturen werden durch die ID3D11Texture2D-Schnittstelle dargestellt. Eine vollständig aufgefüllte 2D-Texturressource sieht wie in der folgenden Abbildung aus.
Diese Texturressource enthält eine einzelne 3x5-Textur mit drei Mipmap-Ebenen.
Eine 2D-Texturarrayressource ist ein homogenes Array von 2D-Texturen. Das heißt, jede Textur hat das gleiche Datenformat und die gleichen Dimensionen (einschließlich Mipmap-Ebenen). Ein 2D-Texturarray wird auch durch die ID3D11Texture2D-Schnittstelle dargestellt. Es hat ein ähnliches Layout wie das 1D-Texturarray, mit der Ausnahme, dass die Texturen jetzt 2D-Daten enthalten, wie in der folgenden Abbildung gezeigt.
Dieses Texturarray enthält drei Texturen. Jede Textur ist 3x5 mit zwei Mipmap-Ebenen.
Verwenden eines 2D-Texturarrays als Texturwürfel
Ein Texturwürfel ist ein 2D-Texturarray, das 6 Texturen enthält, eine für jede Seite des Würfels. Ein vollständig aufgefüllter Texturwürfel sieht wie in der folgenden Abbildung aus.
Ein 2D-Texturarray, das 6 Texturen enthält, kann innerhalb von Shadern mit den systeminternen Funktionen der Cubezuordnung gelesen werden, nachdem sie mit einer Cubetexturansicht an die Pipeline gebunden wurden. Texturwürfel werden vom Shader mit einem 3D-Vektor adressiert, der von der Mitte des Texturwürfels aus zeigt.
Hinweis
Geräte, die Sie mit der Featureebene 10_1 und höher erstellen, können Arrays von Texturwürfeln unterstützen, bei denen die Anzahl der Texturen gleich der Anzahl von Texturwürfeln in einem Array mal sechs ist. Geräte, die Sie mit der Featureebene 10_0 erstellen, unterstützen nur einen einzelnen Texturwürfel mit sechs Gesichtern. Außerdem unterstützt Direct3D 11 keine teilweisen Cubemaps.
3D-Texturen
Eine 3D-Texturressource (auch als Volumentextur bezeichnet) enthält ein 3D-Volumen von Texeln. Da es sich um eine Texturressource handelt, kann sie Mipmap-Ebenen enthalten. 3D-Texturen werden durch die ID3D11Texture3D-Schnittstelle dargestellt. Eine vollständig ausgefüllte 3D-Textur sieht wie in der folgenden Abbildung aus.
Wenn ein 3D-Texturmipmap-Slice als Renderzielausgabe (mit einer Renderzielansicht) gebunden wird, verhält sich die 3D-Textur identisch mit einem 2D-Texturarray mit n Slices. Der bestimmte Renderslice wird aus der Geometry-Shader-Phase ausgewählt, indem eine Skalarkomponente der Ausgabedaten als SV_RenderTargetArrayIndex Systemwert deklariert wird.
Es gibt kein Konzept eines 3D-Texturarrays. Daher ist eine 3D-Texturunterressource eine einzelne Mipmap-Ebene.
Zugehörige Themen