VBO的std :: vector偏移计算?

时间:2011-10-29 14:15:23

标签: c++ opengl stdvector vbo

我正在使用带有交错数组的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个元素/每行的开头开始读取。

2 个答案:

答案 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