1

OpenGL 具有BufferData(int array[])where arraymust be format等功能x-y-z x-y-z ...

它只是一个整数序列,其中每个连续的 3 元组都被解释为一个顶点。

将其表示为 std::vector 是否安全,其中顶点声明为:

struct vertex
{
  int x, y, z;
};

在我看来,这将使在语义上更清楚正在发生的事情。但是,是否有可能保证这会奏效?

如果不是,是否有任何其他方式来提供数据的更多语义表示?

4

2 回答 2

2

它可能有效,但不可靠 - 结构成员之间可能存在未命名的填充,因此您无法保证它们正确对齐

仅使用 std::vector 有什么问题 - 标准保证此内存正确对齐和顺序。

例如,您可以使用:

std::vector<int> cord(3,0);
BufferData(&cord[0]);

[编辑] Mooing Duck 指针需要超过 1 组 3 个,所以在这种情况下只需扩展向量

3 个 3 个整数的元组

std::vector<int> cord(9,0);
BufferData(&cord[0]);
于 2011-10-14T23:48:01.373 回答
0

The struct memory can be packed using compile instruction

#pragma pack(push,1)
struct vertex
{
int x,y,z;
};
#pragma pack(pop,1)

The vector stores the data continuously, which can be verified using the following simple program:

#include <iostream>
#include <vector>

using namespace std;
#pragma pack(push,1)
struct vtx
{
    int x,y,z;
};
#pragma pack(pop,1)

main()
{
    vector<vtx> v(3);
    v[0].x=v[0].y=v[0].z=1;
    v[1].x=v[1].y=v[1].z=2;
    v[2].x=v[2].y=v[2].z=3;
    int *p=&v[0].x;
    for(int i=0;i<9;i++) cout<<*p++<<endl;
}

The output would be: 1 1 1 2 2 2 3 3 3

So the answer is yes.

于 2011-10-15T00:33:14.530 回答