常量浮点寄存器 (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

 

顶点着色器寄存器