texcoord - ps

将 UVW1) (纹理坐标数据解释为 RGBA) (颜色数据。

语法

texcoord dst

 

其中

  • dst 是目标寄存器。

备注

像素着色器版本 1_1 1_2 1_3 1_4 2_0 2_x 2_sw 3_0 3_sw
texcoord x x x

 

此指令将对应于目标寄存器号的 UVW1) (纹理坐标集解释为 RGBA) (颜色数据。 如果纹理坐标集包含的分量少于三个,则缺少的分量将设置为 0。 第四个组件始终设置为 1。 所有值都固定在 0 和 1 之间。

texcoord 的优点是,它提供了一种将高精度内插的顶点数据直接传递到像素着色器的方法。 但是,将数据写入目标寄存器时,将丢失一些精度,具体取决于硬件用于寄存器的位数。

此指令未对纹理采样。 仅在此纹理阶段上设置的纹理坐标是相关的。

任何纹理数据 ((如位置、法线和光源方向) )都可以由顶点着色器映射到纹理坐标中。 这是通过使用 SetTexture 将纹理与纹理寄存器相关联,以及通过使用 SetTextureStageState 指定纹理采样方式来完成的。 如果使用固定函数管道,请确保提供 TSS_TEXCOORDINDEX 标志。

此指令的使用方式如下:

texcoord tn

纹理坐标寄存器 (tn) 包含 RGBA) (四个颜色值。 也可将数据视为 xyzw) (矢量数据。 texcoord 将从纹理坐标集 x 中检索其中三个值 (xyz) ,w) 的第四个分量 (设置为 1。 纹理地址是从纹理坐标集 n 复制的。 结果被固定在 0 和 1 之间。

本例只用于演示。 着色器附带的 C 代码尚未针对性能进行优化。

下面是使用 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

下图显示了像素着色器的呈现输出。 (u,v,w,1) 坐标值映射到 (rgb) 通道。 alpha 通道设置为 1。 在插图的角落,坐标 (0,0,0,1) 被解释为黑色; (1,0,0,1) 为红色; (0,1,0,1) 为绿色:和 (1,1,0,1) 包含绿色和红色,产生黄色。

示例像素着色器的呈现输出图示

使用此着色器需要其他代码,下面显示了一个示例方案。

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

像素着色器说明