std :: vector Расчет смещения для VBO? - PullRequest
1 голос
/ 29 октября 2011

Я использую 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 это не так. Определение вектора должно иметь двенадцать столбцов и n-ых строк, таких как:

vector< vector<GLfloat> > vec_interleaved(12,vector<GLfloat>(4) );

Итак, до моего вопроса, как вы рассчитываете смещение для вектора? в этом случае я хочу, чтобы буфер начинал чтение с каждых 12 элементов / начала каждой строки.

Ответы [ 2 ]

2 голосов
/ 29 октября 2011

Просто вы не можете.Вектор векторов по существу хранит вектор указателей на память в другом месте, и поэтому он не является смежным и не может быть смещен.

Вам потребуется использовать многомерный массив;как вы уже.

1 голос
/ 29 октября 2011

Просто используйте одномерный вектор:

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

...