C++ HLSL:SV_位置,为什么/如何从浮动3到浮动4?
我刚刚开始学习着色器/hlsl等,所以请原谅这个可能很愚蠢的问题 我正在学习微软的DirectX教程(,)。据我所知,他们将位置定义为浮点值的3元素数组: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 },
// 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。
我天真地以为会发生两件事中的一件:
谢谢 缺少的顶点属性组件的默认值为(0,0,0,1)
证实了D3D8和D3D9的情况,但我找不到一个相同的页面来证实这种行为持续了10和11年。但根据经验,我可以说情况仍然如此。缺少的X、Y和Z组件将替换为0,缺少的W组件将替换为1。我现在正为此挠头。如果让我猜你给出的答案是1,就像在一个教程中,我看到着色器中的代码在相乘之前为w分量指定了1。但是很烦人的是,没有一个教程解释过这一点,他们只是告诉你复制代码,你什么也学不到。哇,这真是晦涩难懂!