VertexBufferObject с чередованными нормалями

У меня есть рабочий Vertex-Buffer-Object, но мне нужно добавить нормали.
Нормы хранятся в том же массиве, что и позиции вершин. Они чередуются

Vx Vy Vz Nx Ny Nz

Это мой код до сих пор:

Значения GLfloat [NUM_POINTS * 3 + NUM_POINTS * 3];
void initScene () {

for(int i = 0; i < (NUM_POINTS) ; i = i+6){
values[i+0] = bunny[i];
values[i+1] = bunny[i+1];
values[i+2] = bunny[i+2];
values[i+3] = normals[i];
values[i+4] = normals[i+1];
values[i+5] = normals[i+2];
}

glGenVertexArrays(1,&bunnyVAO);
glBindVertexArray(bunnyVAO);glGenBuffers(1, &bunnyVBO);
glBindBuffer(GL_ARRAY_BUFFER, bunnyVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(bunny), bunny, GL_STATIC_DRAW);

glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 0,0);
glEnableVertexAttribArray(0);

glGenBuffers(1, &bunnyIBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bunnyIBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(triangles), triangles, GL_STATIC_DRAW);// unbind active buffers //
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}

void renderScene() {
if (bunnyVBO != 0) {
// x: bind VAO //
glEnableClientState(GL_VERTEX_ARRAY);
glBindVertexArray(bunnyVAO);
glDrawElements(GL_TRIANGLES, NUM_TRIANGLES, GL_UNSIGNED_INT, NULL);
glDisableClientState(GL_VERTEX_ARRAY);
// unbind active buffers //
glBindVertexArray(0);
}
}

Я могу видеть что-то на экране, но это не правильно, так как нормали не используются правильно …
Как я могу использовать массив значений, правильно связанный с моим кодом до сих пор.

0

Решение

Вам нужно вызвать glVertexAttribPointer два раза, один раз для вершин и один раз для нормалей. Вот как вы сообщаете OpenGL, как ваши данные размещаются в вашем буфере вершин.

// Vertices consist of 3 floats, occurring every 24 bytes (6 floats),
// starting at byte 0.
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 24, 0);

// Normals consist of 3 floats, occurring every 24 bytes starting at byte 12.
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 24, 12);

Это предполагает, что ваш обычный атрибут в вашем шейдере имеет индекс 1.

2

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

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

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