glsl vector *矩阵与hlsl不同

时间:2014-08-10 14:29:35

标签: matrix vector glsl shader hlsl

我有两个(相同的)着色器,一个在hlsl中,一个在glsl中。在像素着色器中,我将矢量乘以矩阵进行正常变换。 代码基本上是:

HLSL

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;

1 个答案:

答案 0 :(得分:4)

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

只需使用

vec3 n = m * v;