VBO verses Vertex Array, проблема нормалей вершин в VBO - PullRequest
1 голос
/ 11 марта 2012

Я не знаю, что здесь не так, все работает нормально, кроме нормалей.Когда я использую массив вершин, модель выглядит идеально, но когда я переключаюсь на VBO, модель выглядит хуже из-за нормалей вершин.Я потратил много времени, чтобы исправить это, но не знаю, что случилось.Поколение VBO кажется идеальным.но до сих пор не знаю.Любая идея?

#define BUFFER_OFFSET(i) ((char *)NULL + (i))


void InitVBO(){

glGenBuffers(1, &vboNormID); 
glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLpoint)*nb_Vertices, VertNormals);
glNormalPointer(GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(12));

glGenBuffers(1, &vboVertID); 
glBindBuffer(GL_ARRAY_BUFFER, vboVertID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLpoint)*nb_Vertices, p_VERTICES);
glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(0));


glGenBuffers(1, &indexVBOID); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLFace)*nb_Faces, NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(GLFace)*nb_Faces, p_indices);

//glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLFace)*nb_Faces, p_indices, GL_DYNAMIC_DRAW);}

Код рендеринга следует.VBO + Vertex Array Массив Vertex работает идеально.Я вижу идеальную форму модели с вершинными нормалями, но с VBO есть некоторая проблема с вершинными нормалями.Я думаю, что я делаю что-то не так с BUFFER_OFFSET (12).

void RenderTringularModel(GLvoid){
if(VertNormals && !MESH_SMOOTH)
{
    glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
    glBindBuffer(GL_ARRAY_BUFFER, vboVertID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);

    glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glNormalPointer(GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(12));
    glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(0));

    glDrawElements(GL_TRIANGLES, nb_Faces*3, GL_UNSIGNED_INT, BUFFER_OFFSET(0));
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glPopClientAttrib();

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

}
else
{
    //glShadeModel (GL_FLAT);
    glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), p_VERTICES);
    glNormalPointer(GL_FLOAT,  sizeof(GLpoint), VertNormals);
    glDrawElements(GL_TRIANGLES, 3*nb_Faces, GL_UNSIGNED_INT, p_indices);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glPopClientAttrib();
}

}

ОБНОВЛЕНИЕ 1: Я думаю, что вы говорите об InitVBO .. Я был не правв таком случае.Как насчет этого ... Но это также не работает .. на самом деле проблема в этом .. во многих отношениях я пытался связать нормали вершин в InitVBO () ... но результат приходит один и тот же каждый раз.

    glGenBuffers(1, &vboVertID); 
glBindBuffer(GL_ARRAY_BUFFER, vboVertID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, NULL, GL_DYNAMIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLpoint)*nb_Vertices, p_VERTICES);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, sizeof(GLpoint)*nb_Vertices, VertNormals);  
glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(0));
glNormalPointer(GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(12));

Обновление 2: Хорошо ... я не связываю нормали вершин (vboNormID).Я отказываюсь от этого.теперь нормально ?Теперь это должно работать .. На самом деле я сделал все таким образом ... чтобы связать нормали вершин с vboVertID, с vboNormID и т. Д. И т. Д., Но не каждый метод работает ... Дайте мне какие-либо предложения, анализируя этот код.

    void RenderTringularModel(GLvoid){
if(VertNormals && !MESH_SMOOTH)
{
    glBindBuffer(GL_ARRAY_BUFFER, vboVertID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);

    glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glNormalPointer(GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(12));
    glVertexPointer(3, GL_FLOAT, sizeof(GLpoint), BUFFER_OFFSET(0));

    glDrawElements(GL_TRIANGLES, nb_Faces*3, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

Обновление 3:

Я не знаю, кто сказал мне использовать BUFFER_OFFSET () ... просто дерьмо .. Я исправил это сейчас, теперь работаюхорошо без этого глупого BUFFER_OFFSET () .. Теперь исправленный код действительно прост:

void InitVBO(){
glGenBuffers(1, &vboVertID); 
glBindBuffer(GL_ARRAY_BUFFER, vboVertID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, p_VERTICES, GL_DYNAMIC_DRAW);

glGenBuffers(1, &vboNormID);
glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLpoint)*nb_Vertices, VertNormals, GL_DYNAMIC_DRAW);

glGenBuffers(1, &indexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLFace)*nb_Faces, p_indices, GL_DYNAMIC_DRAW);}


void RenderTringularModel(GLpoint *P, GLpoint *Vn, GLFace *T, int nbF){
glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vboVertID);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vboNormID);
glNormalPointer(GL_FLOAT, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
glDrawElements(GL_TRIANGLES, nb_Faces*3, GL_UNSIGNED_INT, 0);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glPopClientAttrib();}

Теперь, ребята, любезно объясните мне, как я могу обновить эти буферы в режиме реального времени.Я хочу сказать, что мне нужно обновить все данные в режиме реального времени, нормали, вершины, треугольники.например: после разделения треугольников мне нужно будет обновить буфер треугольников вершинами и нормалями ... и еще одна вещь, во время симуляции резки модели, мне нужно обновить положение вершин и нормали, поэтому мне нужно обновитьбуфер в этот момент тоже .. так скажите, что мне делать для такого рода проблемы?как я могу это сделать?мне нужно удалить буферы и восстановить заново?если да то как?

...