0

Vertex-Buffer-Object が機能していますが、法線を追加する必要があります。法線は、頂点の位置と同じ配列に格納されます。それらはインターリーブされています

Vx Vy Vz Nx Ny Nz

これまでの私のコードは次のとおりです。

GLfloat 値[NUM_POINTS*3 + NUM_POINTS*3]; ボイド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);
  }
}

画面に何かが表示されますが、法線が正しく使用されていないため正しくありません...これまでのコードに正しく接続された値配列を使用するにはどうすればよいですか。

4

1 に答える 1

2

glVertexAttribPointer を 2 回呼び出す必要があります。1 回は頂点用、もう 1 回は法線用です。これは、データが頂点バッファー内にどのように配置されているかを 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 であると想定しています。

于 2013-04-16T22:29:15.183 に答える