C++ HLSL:SV_位置,为什么/如何从浮动3到浮动4?

C++ HLSL:SV_位置,为什么/如何从浮动3到浮动4?,c++,directx,hlsl,C++,Directx,Hlsl,我刚刚开始学习着色器/hlsl等,所以请原谅这个可能很愚蠢的问题 我正在学习微软的DirectX教程(,)。据我所知,他们将位置定义为浮点值的3元素数组: // Define the input layout D3D11_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },

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

我正在学习微软的DirectX教程(,)。据我所知,他们将位置定义为浮点值的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。但现在,当查看顶点着色器时,位置突然是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++代码中3个浮点的位置,现在我在顶点着色器中使用了FLAAT4。 我天真地以为会发生两件事中的一件:

  • 或者:Pos被初始化为包含所有零元素的float4数组,然后前3个元素被vertix坐标填充。但这将导致第四个坐标/w=0,而不是1
  • 或者:因为我已经用InputSlot=12定义了“颜色”输入,即从字节偏移量12开始,我可以想象Pos[0]=前四个字节(顶点位置x),Pos[1]=下四个字节(顶点.y),Pos[2]=下四个字节(顶点.z),Pos[3]=下四个字节-这将是颜色的第一个元素
  • 为什么这两种选择/错误都没有发生?DirectX如何以及为什么将我的float3坐标自动转换为w=1的float4


    谢谢

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


    证实了D3D8和D3D9的情况,但我找不到一个相同的页面来证实这种行为持续了10和11年。但根据经验,我可以说情况仍然如此。缺少的X、Y和Z组件将替换为0,缺少的W组件将替换为1。

    我现在正为此挠头。如果让我猜你给出的答案是1,就像在一个教程中,我看到着色器中的代码在相乘之前为w分量指定了1。但是很烦人的是,没有一个教程解释过这一点,他们只是告诉你复制代码,你什么也学不到。哇,这真是晦涩难懂!