Opengl 对于非平方矩阵的glUniformMatrix,转置标志应该发生什么?

Opengl 对于非平方矩阵的glUniformMatrix,转置标志应该发生什么?,opengl,matrix,glsl,shader,transpose,Opengl,Matrix,Glsl,Shader,Transpose,我使用glUniformMatrix4x3fv遇到了我认为奇怪的行为。具体地说,当我为转置标志提供TRUE时,我的着色器变量中缺少矩阵的整行(并且其中的那些是无序的) 比如说。假设我的GLSL着色器中有: mat4x3 T[m]; 然后在我的C++ OpenGL调用中,我想发送一个矩阵,其条目是(以行的主要顺序存储): 我打电话 glUniformMatrix4x3fv(location,m,false,T); 然后我在着色器中看到,每个矩阵正确地显示为: T[0] -> 1

我使用glUniformMatrix4x3fv遇到了我认为奇怪的行为。具体地说,当我为转置标志提供TRUE时,我的着色器变量中缺少矩阵的整行(并且其中的那些是无序的)

比如说。假设我的GLSL着色器中有:

mat4x3 T[m];

然后在我的C++ OpenGL调用中,我想发送一个矩阵,其条目是(以行的主要顺序存储):

我打电话

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
  ...
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
  ... 

但是,如果我把矩阵存储在C++边上(又一行主要顺序):

并尝试将转置标志用作TRUE:

glUniformMatrix4x3fv(location,m,true,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
  ...
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
  ... 
我的数据每四行就丢失一次

这有合理的理由吗?我在(s2.1 p82)中找不到任何内容

GL_版本:2.1 NVIDIA-1.6.36 GL_着色_语言_版本:1.20

然后在我的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矩阵的数据转换的特定问题,它可能只是一个驱动程序错误。< /P>什么意思“这不是行主要顺序,那是列主要顺序”。我的第一个C++矩阵的数据是行主要顺序:{1, 2, 3,4, 5, 6,7, 8, 9,…};对于我的第二个矩阵,正如你写的:{1,4,7,10,2,5,8,11,3,6,9,12,}@mangledorf:我的意思正是我所说的:你的数据按列的主要顺序排列。列主顺序表示数组中的第一个X值是第一列的值,其中X是矩阵中的行数。所有的列都是连续排列的,因此术语“列主”。但是你怎么能告诉我我的数据是如何排序的呢。我想特别告诉你,这是一个大订单。如果我只写矩阵的条目,就没有人知道它是按列还是按行顺序排列的。@mangledorf:您发布的关于代码和应用程序行为的所有信息都表明您的数据是按列顺序排列的。唯一相互矛盾的信息是你坚持认为它不是主要的。因此,要么你发布的代码有误导性,要么你对数据的顺序有误解。这不难证实。给定CPU上存储为浮点数组的矩阵,存储转换的转换组件的索引是什么?如果你的答案是9、10和11,那就是主修。不,我认为你错了。可能您感到困惑,因为GLSL正在存储数据列MARGER。如果我的第一个矩阵T,其大小为m×4的3(在C++侧)是列主,则T〔9〕、t〔10〕、t[ 11〕为204207210。如果像我一直说的,是排大序,那么T[9],T[10],T[11]实际上是10,11,12。如果第二矩阵T(在C++侧)是列主,那么t[9 ],t[10 ],t[11 ]将是301302302。就像我一直说的,这是行的大顺序,那么T[9],T[10],T[11]是6,9,12。对于第二个矩阵,平移分量(使用行主顺序)在T[3],T[7],T[11]值10,11,12T和T[i]表示数组,或者它们是矩阵的图形表示?它们只是矩阵的图形表示。