【问题标题】:glsl vector*matrix different to hlsl与 hlsl 不同的 glsl 向量*矩阵
【发布时间】: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


【解决方案1】:

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

随便用

vec3 n = m * v;

【讨论】:

  • 我正确地传递了它们,但我不知道 hlsl 的数组访问器仍然是行主要的,即使编译为列主要也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 2021-10-15
  • 1970-01-01
相关资源
最近更新 更多