我正在使用带有交错数组的VBO来渲染加载的obj(模型格式)。这可能与矢量有关吗? GL代码使用向量,但向量向量的偏移量将完全不同。因此缓冲区不会正确地逐步通过向量。因此,除了创建之外什么都不做。 所以我的VBO正常代码是(错过了一些不相关的位):
#define BUFFER_OFFSET(bytes) ( (GLubyte*) NULL + (bytes) )
//define interleaved array
GLfloat Cubedata[12][4] =
{
//tu tv Cr Cg Cb Ca Nx Ny Nz Vx Vy Vz
+0.0f, +1.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, -0.5f, +0.5f, +0.5f,//top left 0
+0.0f, +0.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, -0.5f, -0.5f, +0.5f,//bottom left 1
+1.0f, +0.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, +0.5f, -0.5f, +0.5f,//bottom right 2
+1.0f, +1.0f, +1.0f, +0.0f, +0.0f, +0.0f, +0.0f, +0.0f, +1.0f, +0.5f, +0.5f, +0.5f //top right 3
};
//define other stuff
//create vbo
glGenBuffersARB(2, VBOid); //generates ids for the buffers
glBindBufferARB(GL_ARRAY_BUFFER_ARB, VBOid[0]);//specifes the current buffer object
glBufferDataARB(GL_ARRAY_BUFFER_ARB, ( (4 * 12) * sizeof(GLfloat) ), *Cubedata, GL_STATIC_DRAW_ARB);
glInterleavedArrays(GL_T2F_C4F_N3F_V3F, 0, BUFFER_OFFSET(0) );//set offsets
//bind indicies
//bind current buffer, render
这适用于GLfloat类型的数组但是它没有GLfloat的向量。向量定义需要有12列和第n行,例如:
vector< vector<GLfloat> > vec_interleaved(12,vector<GLfloat>(4) );
所以说到我的问题,你如何计算向量的偏移量?在这种情况下,我希望缓冲区从每12个元素/每行的开头开始读取。
答案 0 :(得分:2)
简单地说,你不能。 向量向量本质上是在其他地方存储指向内存的指针向量,因此不是连续的,也不能被偏移。
您需要使用多维数组;就像你已经一样。
答案 1 :(得分:1)
只需使用一维矢量:
std::vector<float> data;
int data_width;
float atXY(std::vector<float> &v, int x, int y)
{
return data[data_width*y + x];
}
从std :: vector派生以添加多维支持是有意义的。但是,当然这是一项非常普遍的任务,已经由某人实施过。即Boost库有它:
http://www.boost.org/doc/libs/1_47_0/libs/multi_index/doc/index.html