【问题标题】:GLSL compile fails on a mat4x3 vec4 multiplicationGLSL 编译在 mat4x3 vec4 乘法上失败
【发布时间】:2014-11-29 00:09:11
【问题描述】:

我有一个工作正常的 GLSL 着色器,直到我添加以下行。

"vec4 coord = texture2D(Coordinates,gl_TexCoord[0].st);"
"mat4x3 theMatrix;"
"theMatrix[1][1] = 1.0;"
"vec3 CampProj = theMatrix * coord;"

当我检查错误日志时,我被告知:

"ERROR: 0:2: '=' :  cannot convert from '4-component vector of float' to '3-component vector of float'\n\n"

如果我将 CampProject 设为 vec4,则编译得很好,但我很困惑 4 列 3 行矩阵乘以 4 分量向量会产生 4 分量向量。

这是一个错误,还是 4x3 矩阵实际上只是引擎盖下的 4x4,最后一行是 0,0,0,1?如果没有,有人可以向我解释为什么编译器坚持返回 vec4?

我通过 VSExpress 2013、win7、Mobile Intel® 4 Series Express Chipset Family 使用 C++

更新:

Reto 的回答是我所期望的。这是编译中的错误。既因为这是在 LA 上下文中唯一有意义的事情,又因为 LA 定义是 GLSL 文档引用的矩阵/矩阵和矩阵/向量乘法;但是,即使在更新了我的视频芯片组驱动程序之后,编译也会显示相同的行为。其他人可以确认 Reto 描述的行为吗?

@Reto 如果没有人在 14 年 5 月 12 日之前确认我会接受你的回答,因为这似乎是唯一真正合乎逻辑的可能性。

【问题讨论】:

  • 您确定没有进行从 vec4 到 vec3 的隐式转换吗?因为 vec3 乘以 4x3 矩阵是有意义的,但 vec4 乘以 4x3 矩阵却不是。也许coord 的最后一个“w”坐标只是被丢弃以进行乘法运算?检查en.wikibooks.org/wiki/GLSL_Programming/…
  • @vmg:很可能尺寸被神奇地扩展为 4x4 并分配了新行 (0,0,0,1)。顺便说一句,这在符合标准的 GLSL 实现中根本不起作用——这是一个 4x3 矩阵 * 一个 1x4 列向量。如果不删除 vec4 的第 4 行或向 4x3 矩阵添加额外的行,就无法满足这一点(没有从 mat4x3 到 mat4 或 vec4 到 vec3 的隐式转换,由 GLSL 定义,所以无论发生什么都是非标准的 AFAIK)。
  • 是的,感谢您的澄清;这正是我试图描述的“从 vec 的第 4 行掉下来”。
  • GLSL 使用 Column Major 方法,因此可以很好地定义 4x3 矩阵乘以 4 行向量。

标签: opengl glsl


【解决方案1】:

这看起来像是您的 GLSL 编译器中的错误。这应该会成功编译:

mat4x3 mat;
vec3 res = mat * vec4(1.0);

这应该给出一个错误:

mat4x3 mat;
vec4 res = mat * vec4(1.0);

我在 3 种配置上对此进行了测试,所有配置都证实了这种行为:

  • 采用 Intel HD Graphics 4600 的 Windows 8.1。
  • Windows 8.1 和 NVIDIA GeForce GT 740M。
  • 带有 Intel Iris Pro 的 Mac OS Yosemite。

这也符合我对规格的理解。在 GLSL 3.30 规范文档中,mat4x3 被描述为:

4 列 3 行的浮点矩阵

乘法由(强调)定义:

运算符是乘法 (*),其中两个操作数都是矩阵,或者一个操作数是向量,另一个是矩阵。右向量操作数被视为列向量,左向量操作数被视为行向量。在所有这些情况下,都要求左操作数的列数等于右操作数的行数。然后,乘法 (*) 操作进行线性代数乘法,产生一个与左操作数具有相同行数和与右操作数相同列数的对象。

在这个例子中,“左操作数的列数”是4,也就是说向量需要有4个“行”,也就是一个有4个元素的列向量。那么,由于左边的操作数有 3 行,所以得到的向量有 3 个“行”,也就是一个包含 3 个元素的列向量。

这也是唯一基于标准线性代数有意义的东西。

【讨论】:

  • 我现在对此表示赞同。检查上面的更新 RE:接受。
  • 我现在已经在新系统 Windows 7、nVidia GTX745 上确认了这一点
【解决方案2】:

那是因为你的 vec4 和 mat4x3 的组件数都是四个。你不能指望从那个乘法中得到一个 vec3。

为什么不直接使用齐次矩阵和 vec4?你会得到一个 vec4,如果你真的需要,可以通过执行将其转换为 vec3

 vec3.xyz

希望这会有所帮助,我的第一个答案!

【讨论】:

  • 4 列 3 行矩阵乘以 4 行向量不能通过我知道的线性代数定义产生 4 分量向量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
相关资源
最近更新 更多