gpt4 book ai didi

C++ 结构内存布局和 OpenGL glVertexPointer?

转载 作者:行者123 更新时间:2023-11-30 03:05:55 25 4
gpt4 key购买 nike

我有以下结构来存储我的顶点数据。

struct Rz3DContourNode {
float x; //pos x
float y; //pos y
float z; //pos z
float nx; //normal x
float ny; //normal y
float nz; //normal z
};

我将顶点列表存储在 STL vector 中,如下所示:

std::vector < Rz3DContourNode >  nodes;

当我尝试将其用作 OPEGL 中的顶点数组时,in 不会错误地呈现。

glVertexPointer(3, GL_FLOAT, 12, &nodes[0]);
glDrawArrays(GL_POINTS,0,nodes.size());

因此,我尝试使用指针算法(假设这是 OPENGL 处理数据的方式)来确认这些值,如下所示:

float *ptr=(float*) &nodes[0];

for(int i=0;i<nodes.size();i++)
{

Rz3DContourNode confirmNode=nodes[i];

float x=*ptr;
ptr++;

float y=*ptr;
ptr++;

float z=*ptr;
ptr++;


//Confirm values !!! Do not equal ??
qDebug("x=%4.2f y=%4.2f z=%4.2f | nx=%4.2f ny=%4.2f nz=%4.2f
",confirmNode.x,confirmNode.y,confirmNode.z,x,y,z);



//Skip normal positions
ptr++;
ptr++;
ptr++;

}

如果我直接从结构中访问值,则值不相等。

这是否意味着结构不会连续保存值?

[编辑] 我刚刚注意到使用 sizeof() 而不是 12 解决了如下问题:

glVertexPointer(3, GL_FLOAT, sizeof(Rz3DContourNode), &nodes[0]);

但我仍然很困惑为什么我的 hack 没有在内存中正确遍历?(为什么 qDebug 不打印相同的值?)

最佳答案

sizeof(Rz3DContourNode) == 6*4 = 24 bytes ... not 12!

步长是每个顶点开始之间的字节数,而不是填充。虽然 0 是一个特殊值,表示数据紧密打包。

因此,如果您使用 3 个 float 作为顶点数据,则步幅为 0 和 12 之间没有区别(因为 3 个 float 是 12 个字节)。在你的例子中,你的结构是 24 字节,所以你应该把它放好。

这个约定(步幅 = 步长,而不是填充)允许简单地使用 sizeof,所以你最终凭直觉做了正确的事情。这对你来说是很好的 API 设计。 :)

参见 glVertexPointer docs :

stride

Specifies the byte offset between consecutive vertices. If stride is 0, the vertices are understood to be tightly packed in the array. The initial value is 0.

关于C++ 结构内存布局和 OpenGL glVertexPointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7304502/

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