【问题标题】:Does the D3D11 HLSL compiler pre-calculate matrices?D3D11 HLSL 编译器是否预先计算矩阵?
【发布时间】:2019-02-24 07:34:31
【问题描述】:

假设我们在 HLSL 中有一个几何着色器(模型 5.0),其中有一个用于缩放的矩阵和一个用于平移的矩阵:

float4x4 scale;
scale[0] = float4( s,   0.0f, 0.0f, 0.0f);
scale[1] = float4(0.0f,  s,   0.0f, 0.0f);
scale[2] = float4(0.0f, 0.0f,  s,   0.0f);
scale[3] = float4(0.0f, 0.0f, 0.0f, 1.0f);

float4x4 translation;
translation[0] = float4(1.0f, 0.0f, 0.0f, 0.0f);
translation[1] = float4(0.0f, 1.0f, 0.0f, 0.0f);
translation[2] = float4(0.0f, 0.0f, 1.0f, 0.0f);
translation[3] = float4( x,    y,    z,   1.0f);

这里s是一个缩放系数,xyz是每个轴的平移量。我们可以通过将这些矩阵相乘将它们组合成一个矩阵:

float4x4 combined;
combined = mul(scale, translation);

但是,也可以在纸上进行这种乘法运算,然后直接初始化组合矩阵。这样做会产生这样的结果:

float4x4 combined;
combined[0] = float4( s,   0.0f, 0.0f, 0.0f);
combined[1] = float4(0.0f,  s,   0.0f, 0.0f);
combined[2] = float4(0.0f, 0.0f,  s,   0.0f);
combined[3] = float4( x,    y,    z,   1.0f);

上面的例子很简单,但是我总共有 4 个矩阵,包括缩放、旋转和平移,所以你知道组合矩阵直接初始化会很麻烦。

因此,如果编译器会在编译期间执行此操作,出于可读性原因,最好单独初始化矩阵,但如果它不在编译期间而是在运行时合并它们,则最好初始化出于性能原因的组合矩阵。

因此,我的问题是:

编译器会在编译过程中自动组合这些矩阵吗?

我目前正在使用D3DCompileFromFile 函数来编译着色器。我不知道该函数是否使用与 Visual Studio 中的编译器相同的编译器,但如果没有,并且 Visual Studio 中的编译器更好,我可以在构建期间编译着色器,然后只需阅读 @ 987654329@文件。

另外,这个几何着色器正在生成广告牌,所以我无法在 CPU 上计算这些矩阵,因为每个广告牌都有不同的矩阵。

【问题讨论】:

    标签: matrix-multiplication directx-11 hlsl


    【解决方案1】:

    虽然 HLSL 编译器会执行一些优化,并且在将编译器着色器字节码转换为特定于硬件的微码时,驱动程序会执行额外的优化,但是与传统 C/C++ 编译器相比,HLSL 编译器的激进程度是有限的.

    由于每个场景多次执行相同的着色器,因此通常在着色器常量中提供预组合矩阵。例如:

    cbuffer Parameters : register(b0)
    {
        float4x4 World
        float3x3 WorldInverseTranspose
        float4x4 WorldViewProj
    };
    

    这里我们提供世界矩阵、世界矩阵的逆转置和预组合的世界观投影矩阵。

    【讨论】:

    • 对不起,我忘了说我在几何着色器中制作广告牌,所以我无法在 CPU 上计算这些矩阵,因为每个广告牌都有不同的矩阵。我已将此信息添加到问题中。
    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    相关资源
    最近更新 更多