[英]glsl vector*matrix different to 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;
HLSL矩阵是行主要的,GLSL是列主要的。 因此,如果您使用与传递到HLSL相同的内存布局将矩阵传递到GLSL着色器,那么您的HLSL行将成为GLSL列。 并且您应该在GLSL着色器中使用列主要乘法来获得与HLSL中相同的效果。
只是用
vec3 n = m * v;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.