HLSL:SV_Position,why/how 从 float3 到 float4?
HLSL: SV_Position, why/how from float3 to float4?
我才刚刚开始学习shaders/hlsl等,所以请原谅这个可能很愚蠢的问题。
我正在学习 Microsoft 的 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。但是现在在查看顶点着色器时,位置突然是 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 个浮点数,现在我突然在我的顶点着色器中使用了一个 float4。
我天真地以为会发生以下两种情况之一:
- 或者:Pos初始化为全零元素的float4数组,然后前3个元素填充顶点坐标。但这会导致第四个坐标 /w = 0,而不是 1.
- 或者:因为我定义了 "Color" InputSlot=12 输入,即以 12 的字节偏移量开始,我可以想象 Pos[0] = 前四个字节(顶点位置 x),Pos[1] = 接下来的 4 个字节 (vertex.y),Pos[2] = 接下来的 4 个字节 (vertex.z),Pos[3] = 接下来的 4 个字节 - 这将是COLOR 的第一个元素。
为什么这两个 alternatives/errors 都没有发生? DirectX 如何以及为什么将我的 float3 坐标自动转换为 w=1 的 float4?
谢谢!
缺少的顶点属性组件的默认值为 (0,0,0,1)。
The MSDN 确认 D3D8 和 D3D9 就是这种情况,但我找不到确认行为持续 10 和 11 的等效页面。不过根据经验,我可以说情况仍然如此.缺少的 X、Y 和 Z 组件替换为 0,缺少的 W 组件替换为 1。
我才刚刚开始学习shaders/hlsl等,所以请原谅这个可能很愚蠢的问题。
我正在学习 Microsoft 的 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。但是现在在查看顶点着色器时,位置突然是 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 个浮点数,现在我突然在我的顶点着色器中使用了一个 float4。
我天真地以为会发生以下两种情况之一:
- 或者:Pos初始化为全零元素的float4数组,然后前3个元素填充顶点坐标。但这会导致第四个坐标 /w = 0,而不是 1.
- 或者:因为我定义了 "Color" InputSlot=12 输入,即以 12 的字节偏移量开始,我可以想象 Pos[0] = 前四个字节(顶点位置 x),Pos[1] = 接下来的 4 个字节 (vertex.y),Pos[2] = 接下来的 4 个字节 (vertex.z),Pos[3] = 接下来的 4 个字节 - 这将是COLOR 的第一个元素。
为什么这两个 alternatives/errors 都没有发生? DirectX 如何以及为什么将我的 float3 坐标自动转换为 w=1 的 float4?
谢谢!
缺少的顶点属性组件的默认值为 (0,0,0,1)。
The MSDN 确认 D3D8 和 D3D9 就是这种情况,但我找不到确认行为持续 10 和 11 的等效页面。不过根据经验,我可以说情况仍然如此.缺少的 X、Y 和 Z 组件替换为 0,缺少的 W 组件替换为 1。