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.

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, },
};