Matrix glsl矢量*矩阵与hlsl不同

Matrix glsl矢量*矩阵与hlsl不同,matrix,vector,glsl,shader,hlsl,Matrix,Vector,Glsl,Shader,Hlsl,我有两个(相同的)着色器,一个在hlsl中,一个在glsl中。在像素着色器中,我将向量乘以矩阵进行法线变换。 该守则基本上是: HLSL GLSL 这应该进行行向量乘法,但在glsl中却没有。如果我显式地输入算法,它对这两种情况都有效。 据我所知,glsl和hlsl规范都说,如果向量在左手边,那么它们应该进行行向量相乘 另一件令人困惑的事情是,我在顶点着色器中将一个向量乘以一个矩阵,向量在左侧,但这在glsl和hlsl中都可以正常工作。这让我猜测这只是片段/像素着色器中的一个问题 我使用以下方法

我有两个(相同的)着色器,一个在hlsl中,一个在glsl中。在像素着色器中,我将向量乘以矩阵进行法线变换。 该守则基本上是:

HLSL

GLSL

这应该进行行向量乘法,但在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;

HLSL矩阵是行主矩阵,GLSL是列主矩阵。因此,如果使用与传递到HLSL相同的内存布局将矩阵传递到GLSL着色器,则HLSL行将成为GLSL列。并且应该在GLSL着色器中使用列主乘法,以获得与HLSL中相同的效果

只用

vec3 n = m * v;

如何将矩阵传递给像素着色器?顶点着色器的输入/输出属性是否为逐顶点矩阵?如果每个顶点输出一个不同的矩阵,hw会尝试在每个三角形上插值,可能是错误的。它是一个逐顶点矩阵,但在hlsl中也是一个逐顶点矩阵。这并不能解释为什么编写行向量乘法算法是可行的,但执行v*m命令本身却不行。您是否尝试在GLSL中交换操作数?我不再确定,但我想,我不久前读到,HLSL使用行主矩阵,GLSL使用列主矩阵,反之亦然。我正确地传递了它们,但我不知道HLSL的数组访问器仍然是行主矩阵,即使在编译为列主矩阵时也是如此。
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;
vec3 n = m * v;