GLSL中的向量*矩阵与HLSL不同

4
我可以帮你翻译成中文。这段内容是关于编程的,涉及到两种不同语言(hlsl和glsl)下相同的着色器。在像素着色器中,我通过一个矩阵将一个向量进行正常变换。代码如下:
float3 v = ...;
float3x3 m = ...;
float3 n = mul(v, m);

GLSL

vec3 v = ...;
mat3 m = ...;
vec3 n = v * m;

这应该是行向量乘法,但在glsl中却不是。如果我明确地输入算法,则两者都可以工作。

从我所看到的glsl和hlsl规范来看,如果向量在左手边,它们应该执行行向量乘法。

另一个令人困惑的事情是,我在顶点着色器中将向量放在左侧与矩阵相乘,但在glsl和hlsl中都可以正常工作。这让我猜想,这只是在片段/像素着色器中存在问题。

我使用以下方式将矩阵从顶点着色器传递到片段着色器:

out vec3 out_vs_TangentToWorldX;
out vec3 out_vs_TangentToWorldY;
out vec3 out_vs_TangentToWorldZ;

out_vs_TangentToWorldX = tangent * world3D;
out_vs_TangentToWorldY = binormal * world3D;
out_vs_TangentToWorldZ = normal * world3D;

在片段着色器中,我使用以下代码重新构建它:
in vec3 out_vs_TangentToWorldX;
in vec3 out_vs_TangentToWorldY;
in vec3 out_vs_TangentToWorldZ;

mat3 tangentToWorld;
tangentToWorld[0] = out_vs_TangentToWorldX;
tangentToWorld[1] = out_vs_TangentToWorldY;
tangentToWorld[2] = out_vs_TangentToWorldZ;

你是如何将矩阵传递给像素着色器的? - CynicismRising
顶点着色器中的输入/输出属性 - Programmdude
它是一个每个顶点矩阵,但在hlsl中也是每个顶点矩阵。这并不能解释为什么编写行向量乘法算法有效,而执行v * m命令本身却无效。 - Programmdude
你有尝试过在GLSL中交换操作数吗?我不确定了,但我记得一段时间前有阅读过,HLSL使用行主序矩阵而GLSL使用列主序或者反之。 - Gnietschow
这样可以运行,但很奇怪,因为我已经检查过hlsl和glsl都使用列主矩阵。如果我交换所有的矩阵乘法,它就会出错,只有交换像素着色器的mul才能正常工作。 - Programmdude
显示剩余4条评论
1个回答

5

只需使用

vec3 n = m * v;

我已经正确地传递了它们,但我没有意识到 hlsl 的数组访问器仍然是行主序的,即使编译为列主序。 - Programmdude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接