-1

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

4

1 回答 1

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

于 2011-10-05T08:31:39.967 回答