HLSL:SV_Position,为什么/如何从float3到float4?

时间:2015-04-19 10:01:08

标签: c++ directx hlsl

我刚刚开始学习着色器/ hlsl等,所以请原谅这个可能很愚蠢的问题。

我正在关注微软的DirectX教程(Tutorial (link)Code (link))。据我所知,他们将POSITION定义为浮点值的3元素数组:

// Define the input layout 
    D3D11_INPUT_ELEMENT_DESC layout[] = 
    { 
        { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
        { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }, 
    }; 

理所当然,每个顶点位置都有3个浮点值:x,y和z。但现在在查看Vertex着色器时,位置突然出现float4类型,而不是float3:

//--------------------------------------------------------------------------------------
// Vertex Shader
//--------------------------------------------------------------------------------------
VS_OUTPUT VS( float4 Pos : POSITION, float4 Color : COLOR )
{
    VS_OUTPUT output = (VS_OUTPUT)0;
    output.Pos = mul( Pos, World );
    output.Pos = mul( output.Pos, View );
    output.Pos = mul( output.Pos, Projection );
    output.Color = Color;
    return output;
}

我知道float4基本上是一个同质的坐标,需要进行转换。由于这是一个位置,我希望Pos(Pos.w,如果你愿意)的第四个值为1.

但这种转换究竟是如何运作的呢?我刚刚在C ++代码中将POSITION定义为3个浮点数,现在我突然在我的Vertex着色器中使用了float4。

在我的天真中,我原本期望发生以下两件事之一:

  1. 或者:Pos初始化为包含所有零元素的float4数组,然后前三个元素用vertix坐标填充。但这会导致第四个坐标/ w = 0,而不是1。
  2. 或者:由于我已经使用InputSlot = 12定义了“Color”输入,即以12的字节偏移量开始,我可以想象Pos [0] =前四个字节(顶点位置x), Pos [1] =接下来的4个字节(vertex.y),Pos [2] =接下来的4个字节(vertex.z),Pos [3] =接下来的4个字节 - 这将是COLOR的第一个元素。
  3. 为什么这些替代/错误都不会发生? DirectX如何以及为什么将我的float3坐标自动转换为具有w = 1的float4?

    谢谢!

1 个答案:

答案 0 :(得分:7)

缺少的顶点属性组件的默认值为(0,0,0,1)。

The MSDN确认了D3D8和D3D9的情况,但我找不到确认行为持续10和11的等效页面。但从经验来看,我可以说这仍然是这种情况。缺少的X,Y和Z组件将替换为0,缺少的W组件将替换为1。