texcoord – ps

Interpretiert Texturkoordinatendaten (UVW1) als Farbdaten (RGBA).

Syntax

texcoord dst

Hierbei gilt:

  • dst ist das Zielregister.

Bemerkungen

Pixel-Shaderversionen 1_1 1_2 1 _ 3 1_4 2 _ 0 2 _ x 2 _ sw 3 _ 0 3 _ sw
texcoord x x x

Diese Anweisung interpretiert den Texturkoordinatensatz (UVW1), der der Zielregisternummer entspricht, als Farbdaten (RGBA). Wenn der Texturkoordinatensatz weniger als drei Komponenten enthält, werden die fehlenden Komponenten auf 0 festgelegt. Die vierte Komponente ist immer auf 1 festgelegt. Alle Werte werden zwischen 0 und 1 geklammert.

Der Vorteil von texcoord ist, dass es eine Möglichkeit bietet, Vertexdaten, die mit hoher Genauigkeit interpoliert werden, direkt an den Pixel-Shader zu übergeben. Wenn die Daten jedoch in das Zielregister geschrieben werden, geht eine gewisse Genauigkeit verloren, je nachdem, wie viele Bits von der Hardware für Register verwendet werden.

Von dieser Anweisung wird keine Textur entnommen. Nur Texturkoordinaten, die in dieser Texturphase festgelegt sind, sind relevant.

Texturdaten (z. B. Position, Normal- und Lichtquellenrichtung) können von einem Vertex-Shader einer Texturkoordinate zugeordnet werden. Dies erfolgt durch Zuordnen einer Textur zu einem Texturregister mithilfe von SetTexture und durch Angeben, wie die Texturstichprobe mithilfe von SetTextureStageState erfolgt. Wenn die feste Funktionspipeline verwendet wird, stellen Sie sicher, dass Sie das TSS _ TEXCOORDINDEX-Flag verwenden.

Diese Anweisung wird wie folgt verwendet:

texcoord tn

Ein Texturkoordinatenregister (tn) enthält vier Farbwerte (RGBA). Die Daten können auch als Vektordaten (xyzw) betrachtet werden. texcoord ruft drei dieser Werte (xyz) aus Texturkoordinatensatz x ab, und die vierte Komponente (w) ist auf 1 festgelegt. Die Texturadresse wird aus dem Texturkoordinatensatz n kopiert. Das Ergebnis wird zwischen 0 und 1 geklammert.

Dieses Beispiel dient nur zur Veranschaulichung. Der C-Code, der dem Shader beitiert, wurde nicht für die Leistung optimiert.

Hier ist ein Beispiel für einen Shader mit texcoord.

ps_1_1        ; version instruction
texcoord t0   ; declare t0 hold texture coordinates, 
              ; which represent rgba values in this example
mov r0, t0    ; move the color in t0 to output register r0

Die gerenderte Ausgabe des Pixel-Shaders ist in der folgenden Abbildung dargestellt. Die Koordinatenwerte (u,v,w,1) werden den (rgb)-Kanälen angezeigt. Der Alphakanal ist auf 1 festgelegt. An den Ecken der Abbildung wird die Koordinate (0,0,0,1) als schwarz interpretiert. (1,0,0,1) ist rot; (0,1,0,1) ist grün; und (1,1,0,1) enthält Grün und Rot, was Gelb erzeugt.

Abbildung der gerenderten Ausgabe des Beispielpixel-Shaders

Für die Verwendung dieses Shaders ist zusätzlicher Code erforderlich, und unten ist ein Beispielszenario dargestellt.

// This code creates the shader from a file. The contents of  
// the shader file can also be supplied as a text string.
LPD3DXBUFFER        pCode;

// Assemble the vertex shader from the file
D3DXAssembleShaderFromFile(strPShaderPath, 0, NULL, &pCode, NULL);
m_pd3dDevice->CreatePixelShader((DWORD*)pCode->GetBufferPointer(),
                   &m_hPixelShader);
pCode->Release();

// This code defines the object vertex data
struct CUSTOMVERTEX
{
    FLOAT x, y, z;
    FLOAT tu1, tv1;
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1|TEXCOORD2(0))

static CUSTOMVERTEX g_Vertices[]=
{
    //  x      y     z     u1    v1   
    { -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, },
    { +1.0f, -1.0f, 0.0f, 1.0f, 0.0f, },
    { +1.0f, +1.0f, 0.0f, 1.0f, 1.0f, },
    { -1.0f, +1.0f, 0.0f, 0.0f, 1.0f, },
};

Anweisungen für Pixel-Shader