2016-10-31 2 views
1

У меня есть модель, которую я хочу отобразить с помощью glMultiDrawElements. Подготовка данных и их рендеринг с использованием простых векторов работает нормально, но сбой при использовании вершинных буферов. По-видимому, я делаю какую-то ошибку при вычислении смещений буфера. Первый рабочий код:glMultiDrawElements VBOs

Я первый шаг я подготовить данные для последующего использования (содержит псевдокод, чтобы сделать его более удобным для чтения):

for(each face in the model){ 
    const Face &f = *face; 

    drawSizes.push_back(3); 

    for(int i=0;i<f.numberVertices;++i){ 
     const Vertex &v = vertices[f.vertices[i]]]; // points to vertex array 
    vertexArray.push_back(v.x); 
    indexArray.push_back(vertexArray.size() - 1); 
    vertexArray.push_back(v.y); 
    indexArray.push_back(vertexArray.size() - 1); 
    vertexArray.push_back(v.z); 
    indexArray.push_back(vertexArray.size() - 1); 

    normalArray.push_back(f.normalx); 
    normalArray.push_back(f.normaly); 
    normalArray.push_back(f.normalz); 
    } 
} 

int counter = 0; 

for(each face in the model){ 
    vertexIndexStart.push_back(&indexArray[counter*3]); 
    offsetIndexArray.push_back(static_cast<void*>(0) + counter*3); 
    counter++; 
} 

drawSizes is a vector<Glint> 
vertexArray is a vector<GLfloat> 
indexArray is a vector<GLint> 
vertexIndexStart is a vector<Glvoid *> 
offsetIndexArray is a vector<GLvoid *> 

я теперь сделать это с glMultiDrawElements-функции в следующим образом:

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glVertexPointer(3,GL_FLOAT,3*sizeof(GLfloat),&vertexArray[0]); 
glNormalPointer(GL_FLOAT,0,&normalArray[0]); 
glMultiDrawElements(GL_POLYGON,&drawSizes[0],GL_UNSIGNED_INT,&vertexIndexStart[0],vertexIndexStart.size()); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY); 

и тащит модель так же, как и должно быть, Altough производительность не намного лучше, чем в непосредственном режиме.

Когда я теперь пытаюсь буферизовать созданные данные и визуализировать модель с использованием буферов, она, по-видимому, не работает. Опять же, в качестве первого шага я препроцессировать уже обработанные данные:

glGenBuffers(2,buffers); 
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 
glBufferData(GL_ARRAY_BUFFER,sizeof(vertexArray),&vertexArray[0],GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER,0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexArray),&indexArray[0],GL_STATIC_DRAW); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); 

buffers is a GLuint[] 

Тогда я пытаюсь визуализировать данные:

glEnableClientState(GL_VERTEX_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER, buffers[0]); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); 
glVertexPointer(3,GL_FLOAT,3*sizeof(GLfloat),0); 
glMultiDrawElements(GL_POLYGON,&drawSizes[0],GL_UNSIGNED_INT,&offsetIndexArray[0],vertexIndexStart.size()); 
glBindBuffer(GL_ARRAY_BUFFER,0); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); 
glDisableClientState(GL_VERTEX_ARRAY); 

, что приводит к пустому экрану. Есть идеи?

Редактировать: теперь я использую правильные индексы, как было предложено, но я до сих пор не получаю желаемого результата.

+0

Не используйте многострочные элементы, чтобы каждый отдельный ничья составлял всего 3 вершины. –

ответ

0

Это неправильно: буфер массива

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[1]); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertexIndexStart),&vertexIndexStart[0],GL_STATIC_DRAW); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); 

Элемента должен содержать массив индекса, что означает, что индексы в вершине массивы, а не индексы в массив индексов.

Также обратите внимание, что ваш код использует множество устаревших функций GL (встроенные атрибуты, возможно, даже конвейер с фиксированной функцией, рисунок без VAO) и не будет работать в основном профиле современного OpenGL.

Говоря о современном GL: Этот дополнительный уровень косвенности, где массив параметров для glMultiDrawElements сам по себе происходит от объекта-буфера, даже поддерживается в современном GL через glMultiDrawElemetnsIndirect.

+0

Я изменил код так, чтобы вершины были переданы в буфер, но у меня все еще нет рендеринга модели. Правильно ли создается буфер смещения? И что было бы лучше, чем фиксированная функция? Использование шейдеров? – narain

+0

Что вы подразумеваете под «вершины передаются в буфер»? Вам нужно передать индексный массив. Кроме того, весь ваш подход очень неэффективен. вы в основном пытаетесь рисовать каждую грань отдельно. Вы должны просто построить массив вершин и индексов для всего объекта. Это полностью устранило бы необходимость «MultiDraw ...» в первую очередь. Использование современных GL требует шейдеров, да, но есть намного больше. – derhass

+0

Я уже написал шейдер, который эмулирует конвейер фиксированной функции, но я бы предпочел сначала разобраться в этом. Я имел в виду, что я передаю индексный массив. Я думаю, проблема заключается в смещении массива. – narain

Смежные вопросы