我有一个工作正常的 GLSL 着色器,直到我向它添加以下几行。
"vec4 coord = texture2D(Coordinates,gl_TexCoord[0].st);"
"mat4x3 theMatrix;"
"theMatrix[1][1] = 1.0;"
"vec3 CampProj = theMatrix * coord;"
Run Code Online (Sandbox Code Playgroud)
当我检查错误日志时,我被告知:
"ERROR: 0:2: '=' : cannot convert from '4-component vector of float' to '3-component vector of float'\n\n"
Run Code Online (Sandbox Code Playgroud)
如果我将 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 文档中针对矩阵/矩阵和矩阵 / vec 乘法所引用的内容;然而,即使在更新了我的视频芯片组驱动程序之后,编译也显示了相同的行为。其他人能否证实 Reto 描述的行为?
@Reto 如果没有人在 12-05-14 之前确认我会接受你的答案,因为它似乎是唯一真正合乎逻辑的可能性。
这看起来像是 GLSL 编译器中的错误。这应该编译成功:
mat4x3 mat;
vec3 res = mat * vec4(1.0);
Run Code Online (Sandbox Code Playgroud)
这应该会给出一个错误:
mat4x3 mat;
vec4 res = mat * vec4(1.0);
Run Code Online (Sandbox Code Playgroud)
我在 3 种配置上对此进行了测试,所有配置都证实了这种行为:
这也符合我对规格的理解。在 GLSL 3.30 规范文档中,mat4x3
描述为:
一个 4 列 3 行的浮点矩阵
乘法定义为(强调):
运算符是乘法 (*),其中两个操作数都是矩阵,或者一个操作数是向量而另一个是矩阵。右向量操作数被视为列向量,左向量操作数被视为行向量。在所有这些情况下,都要求左操作数的列数等于右操作数的行数。然后,乘法 (*) 运算进行线性代数乘法,生成一个对象,该对象的行数与左操作数相同,列数与右操作数相同。
在这个例子中,“左操作数的列数”是4,这意味着向量需要有4个“行”,这是一个有4个元素的列向量。然后,由于左操作数有 3 行,因此结果向量有 3 个“行”,这是一个具有 3 个元素的列向量。
这也是唯一基于标准线性代数有意义的东西。
归档时间: |
|
查看次数: |
2093 次 |
最近记录: |