我使用 glUniformMatrix4x3fv 遇到了在我看来很奇怪的行为。特别是当我将转置标志设为 TRUE 时,我的着色器变量中缺少我的矩阵的整行(并且因此存在的那些行是乱序的)。
例如。假设我的 GLSL 着色器中有:
mat4x3 T[m];
然后在我的 C++ OpenGL 调用中,我想发送一个矩阵,其条目是(以行优先顺序存储):
T =
1 2 3
4 5 6
7 8 9
10 11 12
101 102 103
104 105 106
107 108 109
110 111 112
101 102 103
204 205 206
207 208 209
210 211 212
...
我打电话给
glUniformMatrix4x3fv(location,m,false,T);
然后我在我的着色器中看到每个矩阵正确显示为:
T[0] ->
1 4 7 10
2 5 8 11
3 6 9 12
T[1] ->
101 104 107 110
102 105 108 111
103 106 109 112
...
但是,如果我将我的矩阵存储在 C++ 端作为(再次行主要顺序):
T =
1 4 7 10
2 5 8 11
3 6 9 12
101 104 107 110
102 105 108 111
103 106 109 112
201 204 207 210
202 205 208 211
203 206 209 212
...
并尝试将转置标志用作 TRUE:
glUniformMatrix4x3fv(location,m,true,T);
然后在我的着色器中,矩阵错误地显示为:
T[0] ->
1 4 7 10
2 5 8 11
3 6 9 12
T[1] ->
102 105 108 111
103 106 109 112
201 204 207 210
T[2] ->
203 206 209 212
301 304 307 310
302 305 308 311
...
我的数据的每 4 行都丢失了。
这有合理的理由吗?我在规范中找不到任何东西(s2.1 p82)。
GL_VERSION:2.1 NVIDIA-1.6.36 GL_SHADING_LANGUAGE_VERSION:1.20