C++ 标准::VBO的矢量偏移计算?

C++ 标准::VBO的矢量偏移计算?,c++,opengl,stdvector,vbo,C++,Opengl,Stdvector,Vbo,我正在使用一个带交错数组的VBO来渲染加载的obj(模型格式)。这可以用向量来代替吗?GL代码可以使用向量,但向量向量的偏移量将非常不同。所以缓冲区不能正确地通过向量。因此,只渲染被创建的对象。 因此,我的VBO常规代码是(遗漏了一些不相关的位): 这对于GLfloat类型的数组非常有效,但对于GLfloat类型的向量则不适用。向量定义需要有12列和第n行,例如: vector< vector<GLfloat> > vec_interleaved(12,vector<

我正在使用一个带交错数组的VBO来渲染加载的obj(模型格式)。这可以用向量来代替吗?GL代码可以使用向量,但向量向量的偏移量将非常不同。所以缓冲区不能正确地通过向量。因此,只渲染被创建的对象。 因此,我的VBO常规代码是(遗漏了一些不相关的位):

这对于GLfloat类型的数组非常有效,但对于GLfloat类型的向量则不适用。向量定义需要有12列和第n行,例如:

vector< vector<GLfloat> > vec_interleaved(12,vector<GLfloat>(4) );
vectorvec_交织(12,vector(4));
说到我的问题,如何计算向量的偏移量?在这种情况下,我希望缓冲区开始从每12个元素/每行的开头读取数据。

简单地说,您不能。 向量向量本质上是存储指向其他地方内存的指针向量,因此不是连续的,不能偏移

您将需要使用多维数组;你已经是了。

简单地说,你不能。 向量向量本质上是存储指向其他地方内存的指针向量,因此不是连续的,不能偏移


您将需要使用多维数组;就像你已经做的那样。

只需使用一维向量:

std::vector<float> data;
int data_width;

float atXY(std::vector<float> &v, int x, int y)
{
    return data[data_width*y + x];
}
std::矢量数据;
int数据宽度;
浮点atXY(标准::向量和向量,整数x,整数y)
{
返回数据[数据宽度*y+x];
}
从std::vector派生以添加多维支持是有意义的。当然,这是一项非常普遍的任务,已经有人实施了。也就是说,Boost库有:


只需使用一维向量:

std::vector<float> data;
int data_width;

float atXY(std::vector<float> &v, int x, int y)
{
    return data[data_width*y + x];
}
std::矢量数据;
int数据宽度;
浮点atXY(标准::向量和向量,整数x,整数y)
{
返回数据[数据宽度*y+x];
}
从std::vector派生以添加多维支持是有意义的。当然,这是一项非常普遍的任务,已经有人实施了。也就是说,Boost库有:



我想会有问题的。当您有一个数组时,内存是连续的。对于向量中的向量方案,它不是。你也不能保证偏移量是连续的,因为向量中向量的内存是在堆上分配的。为什么不让向量向量交错(12*4)?@Robert:我刚刚试过,检查了数据是否正确进入向量,似乎没有什么区别。如果数组是在堆上定义的,那么它是否可以与vbo一起工作?@QuantumKarl数据就是数据,不管它存储在哪里。您只是在寻找连续的数据。顺便说一下,sizeof(CubeData)而不是(4*12)*sizeof(GLfloat)怎么样?@Daniel&Banthar:好的,我把上面的代码改为:vectorvec_interleave(12*4);glBufferDataARB(GL_数组_BUFFER_ARB,(sizeof(vec_交错)*sizeof(GLfloat)),&vec_交错,GL_静态_绘制(ARB);唯一的问题是,没有按照方法的要求将vector转换为GLvoid*,因此如果我将&vec_interleave替换为(GLvoid*)vec_interleave,我会得到一个编译错误,因此这不可能:/我想会有问题的。当您有一个数组时,内存是连续的。对于向量中的向量方案,它不是。你也不能保证偏移量是连续的,因为向量中向量的内存是在堆上分配的。为什么不让向量向量交错(12*4)?@Robert:我刚刚试过,检查了数据是否正确进入向量,似乎没有什么区别。如果数组是在堆上定义的,那么它是否可以与vbo一起工作?@QuantumKarl数据就是数据,不管它存储在哪里。您只是在寻找连续的数据。顺便说一下,sizeof(CubeData)而不是(4*12)*sizeof(GLfloat)怎么样?@Daniel&Banthar:好的,我把上面的代码改为:vectorvec_interleave(12*4);glBufferDataARB(GL_数组_BUFFER_ARB,(sizeof(vec_交错)*sizeof(GLfloat)),&vec_交错,GL_静态_绘制(ARB);唯一的问题是,没有按照方法的要求将vector转换为GLvoid*,因此如果我将&vec_interleave替换为(GLvoid*)vec_interleave,我会得到一个编译错误,因此这不可能:/在cpluplusreference.com上,它说“向量容器被实现为动态数组;就像常规数组一样,向量容器的元素存储在连续的存储位置,这意味着它们的元素不仅可以使用迭代器访问,还可以使用指向元素的常规指针上的偏移量来访问。”那么指针算术不起作用吗?@QuantumKarl它在单个向量中起作用。如果你有向量的向量,你有很多不同的向量,指针算法在它们之间不起作用。我想你应该使用向量,这样列的数量是恒定的,而行的数量可以增加。@Banthar:那么如果我使用1D向量,偏移量会和上面的数组一样吗?@QuantumKarl
向量在内部使用数组,所以元素之间的偏移量应该是相同的。在cpluplusreference.com上它说“向量容器实现为动态数组;与常规数组一样,向量容器的元素存储在连续的存储位置,这意味着它们的元素不仅可以使用迭代器访问,还可以使用指向元素的常规指针上的偏移量访问。“那么指针算术不起作用吗?@QuantumKarl它在单个向量中起作用。如果你有向量的向量,你有很多不同的向量,指针算法在它们之间不起作用。我想你应该使用
向量
,这样列的数量是恒定的,而行的数量可以增加。@Banthar:那么如果我使用1D向量,偏移量会和上面的数组一样吗?@Quantumkal
向量
在内部使用数组,所以元素之间的偏移量应该是相同的。我不允许使用boost libr