VBO Освещение и индексирование

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

Как я храню данные:

struct MyVertex
{
float x, y, z;        //Vertex
float nx, ny, nz;     //Normal
};

Вот как я настроил VBO:

GLuint VertexVBOID, IndexVBOID;
glGenBuffers(1, &VertexVBOID);
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glBufferData(GL_ARRAY_BUFFER, sizeof(MyVertex)*NumOfV, &ModelV[0].x, GL_STATIC_DRAW);

glGenBuffers(1, &IndexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*NumOfF*3, &ModelI[0], GL_STATIC_DRAW);

Мой код рендеринга:

if(UsingVBO == false)
{
glRotatef(Timer.getElapsedTime().asSeconds() * 10, 0, 1, 0);
glBegin(GL_TRIANGLES);
for(int i = 0; i < NumOfF*3; i+=3)
{
glNormal3f(ModelV[ModelI[i]].nx, ModelV[ModelI[i]].ny, ModelV[ModelI[i]].nz);
glVertex3f(ModelV[ModelI[i]].x, ModelV[ModelI[i]].y, ModelV[ModelI[i]].z);

glNormal3f(ModelV[ModelI[i+1]].nx, ModelV[ModelI[i+1]].ny, ModelV[ModelI[i+1]].nz);
glVertex3f(ModelV[ModelI[i+1]].x, ModelV[ModelI[i+1]].y, ModelV[ModelI[i+1]].z);

glNormal3f(ModelV[ModelI[i+2]].nx, ModelV[ModelI[i+2]].ny, ModelV[ModelI[i+2]].nz);
glVertex3f(ModelV[ModelI[i+2]].x, ModelV[ModelI[i+2]].y, ModelV[ModelI[i+2]].z);
}
glEnd();
}
else
{
glRotatef(Timer.getElapsedTime().asSeconds() * 10, 0, 1, 0);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);

glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), 0);
glNormalPointer(GL_FLOAT, sizeof(MyVertex), (void*)(NumOfV*sizeof(float)));//Number of vertices times size of float
glDrawElements(GL_TRIANGLES, NumOfF*3, GL_UNSIGNED_INT, 0);//number of indices

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
}

Рендеринг без VBO:

Pic1

Рендеринг с VBO:

pic2

1

Решение

glNormalPointer(GL_FLOAT, sizeof(MyVertex), (void*)(NumOfV*sizeof(float)));//Number of vertices times size of float

Ваш смещение неверно Вот. Вы предоставляете данные с чередованием вершин, так что первые три числа с плавающей точкой — это ваши позиции, а следующие три числа с плавающей точкой — нормали. Поэтому ваше базовое смещение для нормалей составляет 3 байта с плавающей запятой (чтобы пропустить позицию). NumOfV это количество вершин во всей вашей модели, не количество поплавков для позиций в вашем MyVertex структура данных.

Это лучше всего сделать с offsetof макрос:

glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), (void*)offsetof(MyVertex, x));
glNormalPointer(GL_FLOAT, sizeof(MyVertex), (void*)offsetof(MyVertex, nx));
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]