- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
HLSL 的 mul( x, y) 的参数表示 here : 这么说
这是否意味着:
一个。
行主矩阵
列主矩阵
因为 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/
在 HLSL/Directx11 中工作时,我看到有两种绑定(bind) 3D 渲染目标的方法:绑定(bind)整个目标或在指定图层时绑定(bind)它。 如果绑定(bind)整个目标,如何在 HLS
我正在将一些 OpenCL 代码转换为 DirectCompute,需要在计算着色器中处理 8 位字符串,但找不到“字节”或“字符”的 HLSL 数据类型。 OpenCL 支持“char”类型,所以我
我是一个初学者像素着色器作家,我遇到了一些麻烦。我想获取 256x256、16 位输入 (DXGI_FORMAT_R16_UINT) 图像,并通过 256x256 查找纹理 (DXGI_FORMAT_
我正在寻找可以将 cg/hlsl 混合着色器转换为 glsl es 着色器的工具。我已经尝试过 hlsl2glsl,它不理解关键字“extern”,尽管它是一个可行的 hlsl 关键字,并且查看了 c
我正在寻找可以将 cg/hlsl 混合着色器转换为 glsl es 着色器的工具。我已经尝试过 hlsl2glsl,它不理解关键字“extern”,尽管它是一个可行的 hlsl 关键字,并且查看了 c
在过去一个月左右的时间里,我一直在努力学习 DirectX。所以我一直在 DirectX 9 和 10 之间来回混合。我在两者中看到的主要变化之一是如何在显卡中处理 vector 。 我注意到的一个重
统一缓冲区和常量缓冲区有什么区别? 它们是完全分开的还是可以将制服视为在恒定缓冲区中?换句话说,如果你想设置一个uniform,你需要一个常量缓冲区还是有其他方法? 我问是因为我有四个变量(float
在详细介绍之前,我想概述一下问题: 我使用 RWStructuredBuffers 来存储我的计算着色器 (CS) 的输出。由于顶点和像素着色器无法从 RWStructuredBuffers 中读取,
似乎此功能的文档记录很差。在 DirectX SDK 中的几何着色器教程中,没有使用 CreateGeometryShaderWithStreamOutput 的示例,也没有任何线程可以解释它的基础知
在着色器模型 3.0 中,我很确定这是一个不,但我还是想问这个, 在着色器模型 5.0 中,您可以在顶点着色器中对纹理进行采样吗? 如果我想为每个顶点提供大量补充信息,我有哪些选择? 编辑: 显然可以
我有一个 HLSL 像素着色器: struct PixelShaderInput { float4 pos : SV_POSITION; float2 texCoord : TEX
我正在尝试实现基于 GPU 的几何裁剪贴图,但在将简单的高度图应用于我的地形时遇到问题。对于高度图,我使用表面格式为“single”的简单纹理。我从 Catalinz's XNA blog 获取了纹理
我想知道 HLSL 中的那些输入和输出语义是干什么用的? 即为什么我必须写那个 TEXCOORD0; struct VS_OUTPUT { float2 tc : TEXCOORD0; }; 当
我找不到任何关于如何在 HLSL 中获取数组长度的文档或示例。 我将一组灯光推送到 hlsl 着色器,我想做一个 for(int i=0; i
HLSL 是否有像 GLSL 这样的常见矩阵的预定义变量? 我在找 gl_ProjectionMatrix和 gl_ModelViewMatrix分别? 谢谢! 最佳答案 不,不幸的是它没有。 您必须
我正在尝试在我的几何着色器中实现行进立方体算法。所以我将我的数据网格放入 Texture3D 中。现在我想在几何着色器中查找数据,这会引发错误“无法将表达式映射到 gs_4_0 指令集” 这是他抛出错
我正在尝试在 HLSL 中制作类似 Photoshop 的斜角效果。 困难的部分是找到一个点与最近边缘的距离(其中 alpha=0) 任何人有任何想法如何做到这一点? 最好的事物, 软件 最佳答案 花
所以,好吧。我正在尝试在我的小型游戏引擎中实现法线贴图,但我无法让它工作。 当我只使用每个顶点法线进行照明时,一切都很好,但是如果我尝试使用法线贴图进行照明,那么一切都会分崩离析。 我知道我有正确的
我正在编写一个着色器(HLSL),并且需要将颜色值打包为R32格式。我发现了用于将浮点数打包为R8G8B8A8格式的各种代码,但它们似乎都没有相反的作用。我的目标是SM3.0,因此(afaik)位操作
我有一个着色器,我想在其中移动顶点着色器中的一半顶点。我试图从性能的角度决定最好的方法,因为我们正在处理超过 100,000 个顶点,所以速度至关重要。我查看了 3 种不同的方法:(伪代码,但足以给你
我是一名优秀的程序员,十分优秀!