OpenGL具有BufferData(int array[])
等功能,其中array
的格式必须为x-y-z x-y-z ...
。
它只是一个整数序列,其中每个连续的3元组被解释为顶点。
将此表示为std :: vector是安全的,其中vertex声明为:
struct vertex
{
int x, y, z;
};
在我看来,这会使语义更加清晰。但是,有可能保证这会起作用吗?
如果不是,还有其他方法可以提供更加语义的数据表示吗?
答案 0 :(得分: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]);
答案 1 :(得分:0)
结构存储器可以使用编译指令打包
#pragma pack(push,1)
struct vertex
{
int x,y,z;
};
#pragma pack(pop,1)
向量连续存储数据,可以使用以下简单程序验证:
#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;
}
输出将是: 1 1 1 2 2 2 3 3 3
所以答案是肯定的。