【发布时间】: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 行向量。