我可以帮你翻译成中文。这段内容是关于编程的,涉及到两种不同语言(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;