我浏览了所有关于 DirectX 的 MS 教程,我注意到它们总是将世界、 View 和投影矩阵传递给该技术,然后在顶点着色器中将它们相乘。
是否有理由这样做而不是在绘制之前将矩阵相乘,然后将单个 WVP 矩阵传递给着色器?这样矩阵将每帧相乘一次而不是每个顶点一次,对吧?
提前致谢。
编辑:更新示例代码
MS 教程:
matrix World;
matrix View;
matrix Projection;
struct VS_INPUT
{
float4 Pos : POSITION;
float4 Color : COLOR;
};
struct VS_OUTPUT
{
float4 Pos : SV_POSITION;
float4 Color : COLOR;
};
PS_INPUT VS( VS_INPUT input )
{
VS_OUTPUT output;
output.Pos = mul( input.Pos, World );
output.Pos = mul( output.Pos, View );
output.Pos = mul( output.Pos, Projection );
output.Color = input.Color;
return output;
}
为什么不这样:
matrix WVP;
struct VS_INPUT
{
float4 Pos : POSITION;
float4 Color : COLOR;
};
struct VS_OUTPUT
{
float4 Pos : SV_POSITION;
float4 Color : COLOR;
};
PS_INPUT VS( VS_INPUT input )
{
VS_OUTPUT output;
output.Pos = mul( input.Pos, WVP );
output.Color = input.Color;
return output;
}
最佳答案
在这个例子中,你关于预乘世界、 View 和投影矩阵的建议是有意义的,而且会更有效。对于这个简单的示例,我不确定为什么教程将它们分开。
有时将它们分开(或将世界矩阵分开并具有组合的 View 投影矩阵)是有意义的。例如,有时您可能希望在世界空间而不是对象空间中进行照明,因此您希望在顶点着色器中访问世界空间顶点位置。如果您正在进行某种实例化,您可能希望将世界空间矩阵分开,正如 DeadMG 所指出的那样。但在许多情况下,您会希望按照您的建议组合它们。
关于c++ - 将世界、 View 和投影矩阵传递给 Direct3D 中的着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13521459/