glsl向量*矩阵与hlsl不同

Pro*_*ude 4 shader vector glsl matrix hlsl

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

HLSL

float3 v = ...;
float3x3 m = ...;
float3 n = mul(v, m);
Run Code Online (Sandbox Code Playgroud)

GLSL

vec3 v = ...;
mat3 m = ...;
vec3 n = v * m;
Run Code Online (Sandbox Code Playgroud)

这应该执行行向量乘法,但在 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;
Run Code Online (Sandbox Code Playgroud)

在片段着色器中我用以下命令重建它:

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;
Run Code Online (Sandbox Code Playgroud)

Ryh*_*vak 5

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

只需使用

vec3 n = m * v;
Run Code Online (Sandbox Code Playgroud)