我使用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行数据丢失了。
这有明智的理由吗?我在spec(s2.1 p82)中找不到任何内容。
GL_VERSION:2.1 NVIDIA-1.6.36 GL_SHADING_LANGUAGE_VERSION:1.20
答案 0 :(得分:1)
然后在我的C ++ OpenGL调用中,我想发送一个矩阵,其条目是(按行主顺序存储):
这不是行主要订单。那是列主要的顺序。
给出以下4x3矩阵:
1 4 7 10
2 5 8 11
3 6 9 12
这是以列为主的顺序的数据的C ++数组:
{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
这就是你的数据。随意在任何地方插入空间;这完全不相关。
这是行主要顺序中的相同数据:
{1, 4, 7, 10, 2, 5, 8, 11, 3, 6, 9, 12}
至于您为4x3矩阵转置数据时遇到的具体问题,它可能只是一个驱动程序错误。