常量浮点寄存器 (HLSL VS 参考)

四个分量的浮点常量的顶点着色器输入寄存器。 使用 def - vsSetVertexShaderConstantF设置常量寄存器。

常量寄存器文件从顶点着色器的角度是只读的。 任何单个指令只能访问一个常量寄存器。 但是,该指令中的每个源可能会独立重排,并在读取时否定该向量。

着色器常量的行为在 Direct3D 8 和 Direct3D 9 之间发生了变化。

  • 对于 Direct3D 9,使用 defx 为着色器常量空间设置常量。 使用 defx 声明的常量的生存期仅限于该着色器的执行。 相反,使用 API SetXXXShaderConstantX 设置常量在全局空间中初始化常量。 在调用 SetxxxShaderConstants 之前,全局空间中的常量不会复制到本地空间(对着色器可见)。
  • 对于 Direct3D 8,使用 defx 或 API 设置的常量都向着色器常量空间赋值。 每次执行着色器时,当前着色器都会使用常量,而不考虑用于设置它们的技术。

常量寄存器被指定为绝对寄存器或相对寄存器:

c[n]           ; absolute
c[a0.x + n]    ; relative - supported only in version 1_1

因此,可以使用绝对索引或地址寄存器中的相对索引读取常量寄存器。 从范围外寄存器读取返回 (0.0, 0.0, 0.0, 0.0, 0.0)。

例子

下面是在着色器中声明两个浮点常量的示例。

def c40, 0.0f,0.0f,0.0f,0.0f;

每次调用 SetVertexShader时都会加载这些常量。

下面是使用 API 的示例。

    // Set up the vertex shader constants.
    {
        D3DXMATRIXA16 mat;
        D3DXMatrixMultiply( &mat, &m_matView, &m_matProj );
        D3DXMatrixTranspose( &mat, &mat );

        D3DXVECTOR4 vA( sinf(m_fTime)*15.0f, 0.0f, 0.5f, 1.0f );
        D3DXVECTOR4 vD( D3DX_PI, 1.0f/(2.0f*D3DX_PI), 2.0f*D3DX_PI, 0.05f );

        // Taylor series coefficients for sin and cos.
        D3DXVECTOR4 vSin( 1.0f, -1.0f/6.0f, 1.0f/120.0f, -1.0f/5040.0f );
        D3DXVECTOR4 vCos( 1.0f, -1.0f/2.0f, 1.0f/ 24.0f, -1.0f/ 720.0f );

        m_pd3dDevice->SetVertexShaderConstantF(  0, (float*)&mat,  4 );
        m_pd3dDevice->SetVertexShaderConstantF(  4, (float*)&vA,   1 );
        m_pd3dDevice->SetVertexShaderConstantF(  7, (float*)&vD,   1 );
        m_pd3dDevice->SetVertexShaderConstantF( 10, (float*)&vSin, 1 );
        m_pd3dDevice->SetVertexShaderConstantF( 11, (float*)&vCos, 1 );
    }

如果要使用 API 设置常量值,则不需要着色器声明。

顶点着色器版本 1_1 2_0 2_sw 2_x 3_0 3_sw
常量寄存器 x x x x x x

 

顶点着色器寄存器