gpt4 book ai didi

c++ - HLSL mul() 变量说明

转载 作者:可可西里 更新时间:2023-11-01 18:43:20 27 4
gpt4 key购买 nike

HLSL 的 mul( x, y) 的参数表示 here : 这么说

  • 如果 x 是 vector ,则将其视为行 vector 。
  • 如果 y 是 vector ,则将其视为列 vector 。

这是否意味着:

一个。

  • 如果 x 是 vector ,则将 y 视为行主矩阵
  • 如果 y 是 vector ,则 x 被视为列主矩阵

因为 ID3DXBaseEffect::SetMatrix() 传入一个 row-major matrix ,因此我将按以下顺序使用传递到着色器的矩阵:

例如。 Output.mPosition = mul( Input.mPosition, SetMatrix()value ); ?

我刚刚开始使用着色器,目前正在重新学习我的矩阵数学。如果有人能澄清这一点,那就太好了。

最佳答案

没有。术语“行优先”和“列优先”纯粹是指矩阵组件在内存中的存储顺序。它们与矩阵和 vector 的乘法顺序无关。事实上,D3D9 HLSL mul 调用在所有情况下都将矩阵参数解释为列优先。 ID3DXBaseEffect::SetMatrix() 调用将其矩阵参数解释为行优先,并在幕后转置为 mul 预期的列优先顺序。

如果您有一个抽象如下所示的矩阵:

[ a b c d ]
[ e f g h ]
[ i j k l ]
[ m n o p ]

然后当以行优先顺序存储时,它的内存看起来像这样:

a b c d e f g h i j k l m n o p

即一行的元素在内存中都是连续的。如果以列优先顺序存储,其内存将如下所示:

a e i m b f j n c g k o d h l p

一列的元素都是连续的。但是,这对哪个元素是哪个 的影响恰好为零。无论哪种方式,元素 b 仍然位于第一行和第二列。元素的标签没有改变,只是它们映射到内存的方式改变了。

如果您在 C 语言中声明了类似 float matrix[rows][cols] 的数组,那么您正在使用行优先存储。但是,其他一些语言,如 FORTRAN,默认情况下为其多维数组使用列优先存储;并且 OpenGL 也使用列优先存储。

现在,完全分开,有另一个约定的选择,即是使用行 vector 还是列 vector 数学。这与矩阵的内存布局毫无关系,但它会影响您构建矩阵的方式以及乘法的顺序。如果您使用行 vector ,您将执行 vector 矩阵乘法:

            [ a b c d ]
[x y z w] * [ e f g h ] = [x*a + y*e + z*i + w*m, ... ]
[ i j k l ]
[ m n o p ]

如果你使用列 vector ,那么你将进行矩阵 vector 乘法:

[ a b c d ]   [ x ]
[ e f g h ] * [ y ] = [x*a + y*b + z*c + w*d, ... ]
[ i j k l ] [ z ]
[ m n o p ] [ w ]

这是因为在行 vector 数学中, vector 实际上是一个 1×n 矩阵(单行),而在列 vector 数学中它是一个 n×1 矩阵(单列),关于什么的规则允许矩阵的大小相乘决定顺序。 (不能将 4×4 矩阵与 1×4 矩阵相乘,但可以将 4×4 矩阵与 4×1 矩阵相乘。)

请注意,上面两个方程之间的矩阵没有变化;只有 vector 的解释发生了变化。

那么,回到你最初的问题:

当您将 vector 传递给 HLSL 的 mul 时,它会根据它是哪个参数自动“正确”解释它。如果 vector 在左侧,则为行 vector ,如果在右侧,则为列 vector 。

但是,矩阵总是以相同的方式被解释。矩阵就是矩阵,无论它是与左侧的行 vector 相乘还是与右侧的列 vector 相乘。您可以自由决定在代码中使用行 vector 还是列 vector 数学,只要您对此保持一致。 HLSL 在这一点上是不可知的,尽管 D3DX 数学库使用行 vector 。

事实证明,出于某种原因,在 D3D9 HLSL 中,mul 始终期望矩阵以列优先顺序存储。但是,D3DX 数学库以行优先顺序存储矩阵,正如文档所述,ID3DXBaseEffect::SetMatrix() 期望其输入以行优先顺序。它在后台进行转置以准备矩阵以供 mul 使用。

顺便说一句,D3D11 HLSL 默认为列优先顺序,但允许您使用编译器指令来告诉它使用行优先顺序。对于行 vector 与列 vector 数学,它仍然是不可知的。并且 OpenGL GLSL 也使用列优先顺序,但没有(据我所知)提供改变它的方法。

进一步阅读这些问题:

关于c++ - HLSL mul() 变量说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16578765/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com