c++ - 将世界、 View 和投影矩阵传递给 Direct3D 中的着色器

标签 c++ matrix directx shader direct3d

我浏览了所有关于 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/

相关文章:

c++ - 如何使用 win32 编写通用警报消息?

c++ - 为什么 cURL 使用 zlib?

r - 如何从距离矩阵中提取组内和组间距离?在 R

python - 逼近大型对称矩阵的最高 3 个特征值和特征向量的快速方法

c++ - 将 mem_fun_ref 与 boost::shared_ptr 一起使用

c++ - directx 9 找不到包含库

c++ - 多次内存泄漏 - vector 和指针

c++ - 在没有 lambda 的情况下使用 boost coroutine2

c++ - 在字符串、u16string 和 u32string 之间转换

r - 如何用R中的随机数填充矩阵?