我有一个工作正常的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之前确认我会接受你的答案是正确的,因为这似乎是唯一真正合乎逻辑的可能性。
答案 0 :(得分:4)
这看起来像是你的GLSL编译器中的一个错误。这应该成功编译:
mat4x3 mat;
vec3 res = mat * vec4(1.0);
这应该会出错:
mat4x3 mat;
vec4 res = mat * vec4(1.0);
我在3种配置上对此进行了测试,并且所有这些都证实了这种行为:
这也符合我对规格的理解。在GLSL 3.30规范文档中,mat4x3
被描述为:
具有4列和3行的浮点矩阵
和乘法由(强调添加)定义:
运算符是乘法(*),其中两个操作数都是矩阵,或者一个操作数是向量而另一个是矩阵。右向量操作数被视为列向量,左向量操作数被视为行向量。在所有这些情况下,需要左操作数的列数等于右操作数的行数。然后,乘法(*)操作执行线性代数乘法,产生一个与左操作数具有相同行数的对象,并且与右操作数具有相同的列数。
在此示例中,“左操作数的列数”为4,这意味着向量需要具有4个“行”,这是具有4个元素的列向量。然后,由于左操作数有3行,因此得到的向量有3个“行”,这是一个包含3个元素的列向量。
这也是基于标准线性代数的唯一有意义的事情。
答案 1 :(得分:0)
那是因为你的vec4和mat4x3的组件数是4。你不能指望从那个乘法中收到一个vec3。
为什么不使用均匀矩阵和vec4?您将获得一个vec4,如果您真的必须,可以通过
将其转换为vec3 vec3.xyz
希望这有帮助,我的第一个答案!