【发布时间】:2014-08-10 14:29:35
【问题描述】:
我有两个(相同的)着色器,一个在 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 中的逐顶点矩阵。这无法解释为什么编写行向量乘法算法有效,而执行 v * m 命令本身却不行。
-
您是否尝试过交换 GLSL 中的操作数?我不再确定了,但我想,我前段时间读过,HLSL 正在处理行优先矩阵和 GLSL 与 col-major,反之亦然。
标签: matrix vector glsl shader hlsl