2016-05-22 11 views
0

私は単純な3Dエンジンで作業しています。私は現在、レンダリングループ中に切り替えることができる複数のVAOを持つ作業設定を持っていますが、それらはすべてインデックスバッファを使用していません。インデックス付きVBOを使用する適切な方法

私は現在、4つのVBOで構成される新しいVAOを追加しようとしています:vert position、color、normal、およびindices。

すべてがコンパイルされて実行されますが、(インデックス付き頂点を持つ)2番目のVAOへの描画呼び出しはレンダリングされません。私はどこかでセットアップに問題があると確信していますので、VAOとVBOの世代、呼び出し、使用をすべて含むこのコードを追加しました。このコードの内容は間違っているように見えますが、これをすべて設定する正しい方法ですか?

VAO1 3つのバッファを有する:私はそれをチェックして、位置、色、法線及び頂点インデックス

//Initalize vaos and vbos 
GLuint vao1, vbo1[3]; 
GLuint vao2, vbo2[4]; 

//Generate Vertex arrays: 
glGenVertexArrays(1, &vao1); 
glGenVertexArrays(1, &vao2); 

//Generate Buffers: 
glGenBuffers(3, vbo1); 
glGenBuffers(4, vbo2); 

//Initalize Bufferdata vectors: 
vector<GLfloat> VertPosBuffer1Vector; 
vector<GLfloat> VertNormalBuffer1Vector; 
vector<GLfloat> VertColorBuffer1Vector; 

vector<GLfloat> VertPosBuffer2Vector; 
vector<GLfloat> VertNormalBuffer2Vector; 
vector<GLfloat> VertColorBuffer2Vector; 
vector<GLuint> VertIndexBuffer2Vector; 

//Fill Buffers: 
//(not included but all vectors are filled with data) 

//VAO 1 
glBindVertexArray(vao1); 

//Vertex position buffer: 
glBindBuffer(GL_ARRAY_BUFFER, vbo1[0]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertPosBuffer1Vector.size(), &VertPosBuffer1Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(0); 

//Vertex color buffer: 
glBindBuffer(GL_ARRAY_BUFFER, vbo1[1]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertColorBuffer1Vector.size(), &VertColorBuffer1Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(1); 

//Vertex normal buffer: 
glBindBuffer(GL_ARRAY_BUFFER, vbo1[2]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertNormalBuffer1Vector.size(), &VertNormalBuffer1Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(2); 

//VAO 2 
glBindVertexArray(vao2); 

//Vertex position buffer: 
glBindBuffer(GL_ARRAY_BUFFER, vbo2[0]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertPosBuffer2Vector.size(), &VertPosBuffer2Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(0); 

//Vertex color buffer: 
glBindBuffer(GL_ARRAY_BUFFER, vbo2[1]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertColorBuffer2Vector.size(), &VertColorBuffer2Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(1); 

//Vertex normal buffer: 
glBindBuffer(GL_ARRAY_BUFFER, vbo2[2]); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*VertNormalBuffer2Vector.size(), &VertNormalBuffer2Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(2); 

//Vertex index buffer: 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo2[3]); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*VertIndexBuffer2Vector.size(), &VertIndexBuffer2Vector[0], GL_STATIC_DRAW); 
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
glEnableVertexAttribArray(3); 

//unbind vao 
glBindVertexArray(0); 
//bind first vao 
glBindVertexArray(vao1); 

//RENDERLOOP 

//render objects from vao1 using: 
glDrawArrays(GL_TRIANGLES, start, size); 

//switch vao 
glBindVertexArray(0); 
glBindVertexArray(vao2); 

//render objects from vao2 using: 
glDrawElements(
    GL_TRIANGLES,   
    start,   
    GL_UNSIGNED_INT, 
    (void*)0   
); 

:位置、色、法線

はVAO2 3つのバッファを有します私のバッファ内のデータは正しいです。

シェーダがインデックスの情報を受け取っていないのは正しいですか?インデックスバッファを使用しなかった場合と同じシェーダが使用されますか?

ありがとうございました

答えて

2

インデックスは頂点属性ではありません。私はまた、あなたがglDrawElementsのカウント引数として変数「スタート」を使用していることに気づいた

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

:だから何をする必要があるこれらの2行を削除しています。私は開始値とサイズの値は分かりませんが、glDrawElementsの2番目の引数として "size"を使うべきだと思います。

+0

ありがとうございました。これでわからなかったことがクリアされました。しかし、私はすでにそれを試して、それは結果を変更しません。私はまだレンダリングされたものを手に入れません。コードの残りの部分が正しいと思われる場合、そのエラーは他の可能性があります。 – remi000

+0

がコード内で別の問題を発見しました。私の編集を参照してください – bofjas

+0

申し訳ありませんが、この問題はVBOとVAOとは全く関係ありませんでした。 (私の投影とモデル行列のユニフォームで何か問題があります。) あなたが答えたものは他の人の潜在的な答えかもしれないので、私はあなたの答えを受け入れるでしょう! – remi000

関連する問題