具有非方阵的 glUniformMatrix 的转置标志会发生什么?

发布于 2024-12-08 18:32:32 字数 1569 浏览 0 评论 0原文

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

我的数据每第四行都会丢失。

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

GL_版本:2.1 NVIDIA-1.6.36 GL_SHADING_LANGUAGE_VERSION:1.20

I encountered what seemed to me as strange behavior using glUniformMatrix4x3fv. Specifically when I give TRUE as for the transpose flag entire rows of my matrices are missing in my shader variable (and those that are there are therefor out of order).

For example. Say I have in my GLSL shader:

mat4x3 T[m];

Then in my C++ OpenGL call I want to send a matrix whose entries are (stored in row-major order):

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

And I call

glUniformMatrix4x3fv(location,m,false,T);

Then I see in my shader that the each matrix comes out correctly as:

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

BUT, if I store my matrix on the C++ side as (again row-major order):

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

And try to use the transpose flag as TRUE with:

glUniformMatrix4x3fv(location,m,true,T);

Then in my shader the matrices show up incorrectly as:

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

Every 4th row of my data is missing.

Is there a sensible reason for this? I find nothing in the spec (s2.1 p82).

GL_VERSION: 2.1 NVIDIA-1.6.36
GL_SHADING_LANGUAGE_VERSION: 1.20

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

得不到的就毁灭 2024-12-15 18:32:33

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

Then in my C++ OpenGL call I want to send a matrix whose entries are (stored in row-major order):

That's not row-major order. That's column-major order.

Given the following 4x3 matrix:

1  4  7  10
2  5  8  11
3  6  9  12

This is what a C++ array of this data in column-major order would look like:

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

That's what your data is. Feel free to insert space wherever you want; it's entirely irrelevant.

This is what the same data in row-major order looks like:

{1, 4, 7, 10, 2, 5, 8, 11, 3, 6, 9, 12}

As to the specific issue you encountered with transposing your data for 4x3 matrices, it may simply be a driver bug.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文