GL4编译在mat4x3 vec4乘法上失败

时间:2014-11-26 16:52:22

标签: opengl glsl

我有一个工作正常的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,移动式英特尔®4系列高速芯片组家族使用C ++

更新:

Reto的回答是我所期望的。这是编译中的一个错误。两者都是因为这是LA环境中唯一有意义的事情,因为LA定义是GLSL文档引用的矩阵/矩阵和矩阵/ vec乘法;然而,即使在更新我的视频芯片组驱动程序之后,编译也向我展示了相同的行为。另一个人可以确认Reto描述的行为吗?

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

2 个答案:

答案 0 :(得分:4)

这看起来像是你的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。
  • Mac OS Yosemite与Intel Iris Pro。

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

  

具有4列和3行的浮点矩阵

和乘法由(强调添加)定义:

  

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

在此示例中,“左操作数的列数”为4,这意味着向量需要具有4个“行”,这是具有4个元素的列向量。然后,由于左操作数有3行,因此得到的向量有3个“行”,这是一个包含3个元素的列向量。

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

答案 1 :(得分:0)

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

为什么不使用均匀矩阵和vec4?您将获得一个vec4,如果您真的必须,可以通过

将其转换为vec3
 vec3.xyz

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