在 Direct3D 中将世界、视图和投影矩阵传递给着色器

jah*_*aho 4 c++ directx shader direct3d matrix

我正在浏览有关 DirectX 的所有 MS 教程,我注意到它们总是将世界、视图和投影矩阵传递给该技术,然后在顶点着色器中将它们相乘。

是否有理由这样做而不是在绘制之前将矩阵相乘,然后将单个 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;
}
Run Code Online (Sandbox Code Playgroud)

为什么不这样:

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;
}
Run Code Online (Sandbox Code Playgroud)

mat*_*ort 5

在这个例子中,你对世界、视图和投影矩阵进行预乘的建议是有意义的,并且会更有效。对于这个简单的示例,我不确定为什么教程将它们分开。

有时将它们分开是有意义的(或者保持世界矩阵分开并具有组合的视图投影矩阵)。有时您可能希望在世界空间而不是对象空间中进行照明,例如,您希望访问顶点着色器中的世界空间顶点位置。如果您正在做某种实例化,您可能希望保持世界空间矩阵的独立性,正如 DeadMG 所指出的那样。在许多情况下,尽管您会希望按照您的建议将它们组合起来。