Verschiebungszuordnung (Direct3D 9)
Verdrängungszuordnungen ähneln Texturzuordnungen, werden aber von der Vertex-Engine aufgerufen.
Blockdiagramm
Eine zusätzliche Samplerphase ist im frühen Teil der Vertexpipe vorhanden, wie im folgenden Diagramm gezeigt, in dem eine Verschiebungszuordnung zum Bereitstellen von Vertexverschiebungsdaten verwendet werden kann.
Der Zustand des Verschiebungszuordnungs-Samplers kann vom SetSamplerState mit der Stufenummer 256 festgelegt werden, bei der es sich um eine neue Stufennummer handelt. Die Struktur der Verschiebungszuordnung wird von SetTexture festgelegt.
Die Karte kann vorab abgestempelt werden, was bedeutet, dass sie so sortiert werden kann, dass die Nachschlagevorgänge der Verschiebungswerte ohne Filterung möglich sind.
- Verdrängungszuordnungen sind analog zu Texturzuordnungen, werden aber von der Vertex-Engine aufgerufen.
- Im frühen Teil der Vertexpipe ist eine zusätzliche Samplerphase vorhanden, die eine Verschiebungszuordnung abtasten kann. Auf diese Phase kann mit der üblichen SetSamplerState-API zugegriffen werden, aber die Stufennummer ist D3DDMAPSAMPLER = 256.
- Der Zustand des Verschiebungszuordnungs-Samplers kann vom SetSamplerState(D3DDMAPSAMPLER, ...) festgelegt werden. API.
- Die Verschiebungszuordnungstextur wird von der SetTexture(D3DDMAPSAMPLER, Texture)-API festgelegt.
- Die Karte kann vorab stichprobeniert sein oder nicht. Dies bedeutet, dass sie auf eine bestimmte Weise sortiert werden kann, die das Suchen der Verschiebungswerte ohne Filterung ermöglicht.
- Die Änderungen in der Deklarationsstruktur ermöglichen die Angabe der Texturkoordinate, die zum Suchen der Texturzuordnung verwendet wird. Beispiel: Stream0, Offset, FLOAT2, LOOKUP, Displacement_value. Dadurch wird der Tessellator aufgefordert, den 2D-Floatvektor in stream0 an einem bestimmten Offset als Texturkoordinate zu verwenden, um die Verschiebungszuordnung nachzuschlagen und ihr die Displacement_value Verwendungssemantik zuzuordnen. Die Vertex-Shaderdeklaration würde eine Zeile ähnlich {dcl_texture0, v0} enthalten, die angibt, dass die Textur0-Semantik dem Eingaberegister v0 zugeordnet werden soll. Der gesuchte Verschiebungswert wird in das Eingaberegister v0 kopiert.
- Es gibt einen speziellen Typ der Verschiebungszuordnung, wenn die Texturzuordnung vorab stichprobeniert wird. Der sequenzielle Index der generierten Scheitelpunkte wird als Texturkoordinate für eine Texturzuordnung verwendet. Beispiel: 0,0,(D3DDECLTYPE)0,D3DDECLMETHOD_LOOKUPPRESAMPLED, Usage, UsageIndex.
- Die Ausgabe des Suchvorgangs beträgt 4 Floats.
- Die Zuordnung von Verschiebungen wird nur mit N-Patches unterstützt.
- Treiber müssen D3DDMAPSAMPLER in SetTextureStageState ignorieren, wenn sie keine Verschiebungszuordnungen verarbeiten.
- D3DTEXF_ANISOTROPIC Filtermodus wird nicht unterstützt.
- Wenn D3DSAMP_MIPFILTER im Verschiebungskarten-Sampler nicht D3DTEXF_NONE ist, wird die Detailebene wie folgt berechnet (Beachten Sie, dass der adaptive Tessellationszustand auch dann verwendet wird, wenn der D3DRS_ENABLEADAPTIVETESSELLATION FALSE ist): Tmax = Renderzustand D3DRS_MAXTESSELLATIONLEVEL
- Berechnen der Tessellationsebene Tessellation für einen Scheitelpunkt Vi: (Xi, Yi, Zi) auf die gleiche Weise wie im Abschnitt "Adaptive Tessellation" beschrieben. Detailgrad L = log2(Tmax) - log2 (Te).
- Texturfilterungs- und Samplingvorgänge folgen den gleichen Regeln wie die Pixelpipeline (LOD-Verzerrungen werden angewendet usw.).
- Nicht alle Formate können als Verdrängungszuordnungen verwendet werden, sondern nur solche, die die D3DUSAGE_DMAP unterstützen. Die Anwendung kann dies mit checkDeviceFormat CheckDeviceFormat abfragen.
- D3DUSAGE_DMAP müssen in CreateTexture angegeben werden, um den Treiber darüber zu informieren, dass diese Textur als Verschiebungszuordnung verwendet werden soll.
- D3DUSAGE_DMAP können nur mit Texturen verwendet werden. Sie kann nicht mit Cubezuordnungen oder Volumes verwendet werden.
- Texturen und Renderziele, die mit D3DUSAGE_DMAP erstellt wurden, können in regulären Samplerphasen und als Renderziele festgelegt werden.
- Die Renderzustände zum Festlegen des Umbruchmodus für die Texturkoordinaten werden in der Verschiebungszuordnung ignoriert. Im Allgemeinen gibt es keine Umbruchmodi für die Tessellator-Engine.
- Ein Verschiebungsdiagramm-Sampler weist ein verhalten auf, das mit dem der Pixeltextur-Sampler identisch ist. Wenn eine Textur mit weniger als vier Kanälen (z. B. R32f) gesucht wird, werden die gesuchten Werte zu den entsprechenden Kanälen des Zielregisters (das Mit der _sample Semantik markierte Vertex-Shader-Eingaberegister), während die anderen Kanäle standardmäßig (1, 1, 1) angezeigt werden. Bei der Suche wird D3DFMT_L8 in den R-, G-, B-Kanälen und A standardmäßig auf 1 übertragen. Das Referenzrasterprogramm enthält die vollständigen Implementierungsdetails.
Vorab stichprobenierte Verschiebungszuordnung
- Es wird ein neuer Samplerzustand eingeführt: D3DSAMP_DMAPOFFSET (DWORD) – Offset (in Scheitelpunkten) in einer vorab stichprobenierten Verschiebungszuordnung.
- Neue Deklarationsmethode wird eingeführt: D3DDECLMETHOD_LOOKUPPRESAMPLED.
- Adaptive Tessellation sollte deaktiviert sein.
- Texturfiltereinstellungen werden ignoriert. Die Punktentnahme erfolgt. Es wird davon ausgegangen, dass der MIP-Texturfilter D3DTEXF_NONE ist. Es wird davon ausgegangen, dass alle anderen Texturfiltermodi D3DTEXF_POINT sind.
- Texturkoordinaten werden berechnet als: U = (Index % TextureWidthInPixeles) / (float)(TextureWidthInPixeles) V = (Index / TextureWidthInPixeles) / (float)(TextureHeightInPixeles), wobei Index ein sequenzieller Index von generierten Scheitelpunkten plus TSS[D3DSAMP_DMAPOFFSET]. Der sequenzielle Index wird am Anfang jedes Grundtyps auf 0 festgelegt und nach der Generierung eines Scheitelpunkts erhöht.
Dies sind die API-Änderungen, die die Verschiebungszuordnung unterstützen.
- Ein einzelnes Kanalformat hinzugefügt, D3DFMT_L16.
- Ein neues Verwendungsflag, D3DUSAGE_DMAP.
- Eine spezielle Texturstufe, die zum Festlegen einer Verschiebungszuordnungstextur verwendet wird, D3DDMAPSAMPLER.
- Neue Hardwarekappen wurden hinzugefügt, D3DDEVCAPS2_DMAPNPATCH und D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH. Siehe D3DDEVCAPS2.
Zugehörige Themen