使用非方形矩阵的glUniformMatrix的转置标志应该发生什么?

时间:2011-10-05 08:08:19

标签: opengl matrix glsl shader transpose

我使用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

1 个答案:

答案 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矩阵转置数据时遇到的具体问题,它可能只是一个驱动程序错误。