2017-12-19 30 views
2

私は単純な三角形を描き、次のようにバッファを設定しようとしています。バッファとVAOsの設定glDrawElementsはエラーコードなしで例外をスローします

triangle t; 
point3f vertices[] = { t.p1(), t.p2(), t.p3() }; 
GLushort indices[] = { 0, 1, 2 }; 

gl_vertex_array vao{ 3 }; 
vao.bind_vertex_array(); 

gl_vertex_buffer position_vbo{ buffer_type::array_buf }; 
position_vbo.bind_vertex_buffer(); 
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), &vertices[0], 
      GL_STATIC_DRAW); 
position_vbo.unbind_vertex_buffer(); 

gl_vertex_buffer index_vbo{ buffer_type::element_array_buf }; 
index_vbo.bind_vertex_buffer(); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), &indices[0], 
      GL_STATIC_DRAW); 
index_vbo.unbind_vertex_buffer(); 

vao.unbind_vertex_array(); 

は私が考えて大丈夫です、私は各段階でglGetErrorで確認し、すべてが動作しているようです。私のレンダリング機能では、私は次のようにします。

glClearColor(0.4f, 0.3f, 0.6f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

o.vao.bind_vertex_array(); 
o.sp.use_program(); 

GLenum error = glGetError(); 
assert(error == GL_NO_ERROR); 
//glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0); 
glDrawArrays(GL_TRIANGLES, 0, 3); 
error = glGetError(); 
assert(error == GL_NO_ERROR); 

o.sp.unuse_program(); 
o.vao.unbind_vertex_array(); 

glDrawArraysとこのレンダリングコールはうまく動作しますが、私はglDrawElementsでレンダリングしようとしたとき、私は例外がスローされます。さらに、これは難しい例外です。私はエラーコードを見るために次の行に行くことができません。私はOpenGlコールがスローされるかもしれないことを知らなかった。私はここで立ち往生している。何が問題なのでしょうか?ここで

は、問題がVAOセットアップコードにある同様の議論

nvoglv32.dll throws the exception

+0

おそらくアクセス違反です。 –

+0

'GL_ELEMENT_ARRAY_BUFFER'を間違って設定しているような感じです。 –

+0

以前は、バッファ作成サイトを 'glGetError'呼び出しで囲っていましたが、うまくいきました。 – meguli

答えて

1

です。 VAOがバインドされていない前に、インデックスバッファは、結合していない取得します。

index_vbo.unbind_vertex_buffer(); 
vao.unbind_vertex_array(); 

VAOは常にバウンドGL_ELEMENT_ARRAY_BUFFERの最後の状態を保存するので、これは効果的にインデックスバッファのバインドを解除しています。バインドされていないインデックスバッファから読み取ろうとすると、例外が発生します。ソリューションは、これら2つの行を交換することと、最初のVAOのバインドを解除する必要があります

vao.unbind_vertex_array(); 
index_vbo.unbind_vertex_buffer(); 

をニコルボーラはコメントで述べたように:あなたは、実際に完全に要素バッファのバインド解除を離れて残すことができます。 VAOがバインドされていない場合、バインドされた要素バッファは存在しません。

+0

'GL_ARRAY_BUFFER'sでも同様のことが起こりますか?または、彼らは 'glVertexAttribPointer'を呼び出すサイトで' VAO'に通知しましたか? – meguli

+0

'GL_ARRAY_BUFFERS'は、' glVertexAttribPointer'が呼び出されたときに保存されます。これはVAOに複数の 'GL_ARRAY_BUFFER'がありますが、' GL_ELEMENT_ARRAY_BUFFER'は一つしかないからです。 – BDL

+1

@BDL:解決策は、インデックスバッファをまったくアンバインドしないことです。 VAOのバインドを解除すると、*索引バッファーはありません。したがって、バインドを解除すると便利な目的はありません。 –

関連する問題