gpt4 book ai didi

OpenGL:基向量如何在内存中布局

转载 作者:行者123 更新时间:2023-12-02 03:52:44 24 4
gpt4 key购买 nike

这个话题已经讨论过很多次了。网上有很多关于OpenGL中矩阵的内存布局的信息。遗憾的是,不同的来源常常相互矛盾。

我的问题归结为:

When I have three base vectors of my matrix bx, by and bz. If I want to make a matrix out of them to plug them into a shader, how are they laid out in memory?

让我们澄清一下基本向量的含义,因为我怀疑这也可能意味着不同的事情:

当我有一个 3D 模型时,即 Z 向上,我想将其沿 X 轴平放在我的世界空间中,则 bz[1 0 0 ]。 IE。当模型空间中的顶点 [0 0 2] 乘以具有 bz 的矩阵时,该顶点将转换为 [2 0 0] > 作为 Z 轴的基向量。

进入 OpenGL 矩阵内存布局:

根据 GLSL 规范(GLSL Spec p.110),它说:

vec3 v, u;
mat3 m;
u = v * m;

is equivalent to

u.x = dot(v, m[0]); // m[0] is the left column of m
u.y = dot(v, m[1]); // dot(a,b) is the inner (dot) product of a and b
u.z = dot(v, m[2]);

因此,为了获得最佳性能,我应该在顶点着色器中预乘我的顶点(这样 GPU 可以使用点积等):

attribute vec4 vertex;
uniform mat4 mvp;
void main()
{
gl_Position = vertex * mvp;
}

现在 OpenGL 被认为是列优先的 ( GLSL Spec p 101)。 IE。这些列在内存中连续排列:

[ column 0 | column 1 | column 2  | column 3    ]
[ 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 13 14 15 ]

或者:

[
0 4 8 12,
1 5 9 13,
2 6 10 14,
3 7 11 15,
]

这意味着我必须将基本向量存储在如下行中:

bx.x bx.y bx.z 0
by.x by.y by.z 0
bz.x bz.y bz.z 0
0 0 0 1

因此,对于我想要平放的 3D 模型的示例,它具有基本向量:

bx = [0 0 -1]
by = [0 1 0]
bz = [1 0 0]

上面的模型顶点 [0 0 2] 将像顶点着色器中的 dis 一样进行转换:

// m[0] is [ 0 0 1 0]
// m[1] is [ 0 1 0 0]
// m[2] is [-1 0 0 0]
// v is [ 0 0 2 1]
u.x = dot([ 0 0 2 1], [ 0 0 1 0]);
u.y = dot([ 0 0 2 1], [ 0 1 0 0]);
u.z = dot([ 0 0 2 1], [-1 0 0 0]);
// u is [ 2 0 0]

正如预期的那样!

相反:

这个:Correct OpenGL matrix format?所以问题,因此OpenGL Faq状态:

For programming purposes, OpenGL matrices are 16-value arrays with base vectors laid out contiguously in memory. The translation components occupy the 13th, 14th, and 15th elements of the 16-element matrix, where indices are numbered from 1 to 16 as described in section 2.11.2 of the OpenGL 2.1 Specification.

这表示我的基本向量应该布置在如下列中:

bx.x by.x bz.x 0
bx.y by.y bz.y 0
bx.z by.z bz.z 0
0 0 0 1

对我来说,这两个来源都是 Khronos 的官方文档,这两个来源似乎相互矛盾。

有人可以向我解释一下吗?我犯了一个错误吗?确实有错误的信息吗?

最佳答案

常见问题解答正确,应该是:

bx.x by.x bz.x 0
bx.y by.y bz.y 0
bx.z by.z bz.z 0
0 0 0 1

这是你的推理有缺陷的。

假设基向量 bx、by、bz 是世界坐标中给出的模型基,则从模型空间顶点 v 到世界空间顶点 Bv 的变换由基向量的线性组合给出:

B*v = bx*v.x + by*v.y + bz*v.z

它不是 b 与 v 的点积。而是矩阵乘法,其中 B 具有上述形式。

取顶点 u 与 bx 的点积将回答相反的问题:给定一个世界空间 u,它在模型空间中沿轴 bx 的坐标是多少?因此,乘以转置矩阵transpose(B)将得到从世界空间到模型空间的转换。

关于OpenGL:基向量如何在内存中布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44907320/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com