2016-07-07 11 views
1

私は現在、VBOデータを絶えず更新する必要があるプログラムを作成しています。 しかし、バッファを初期化した後にglBindBuffer(GL_ARRAY_BUFFER, 0)と呼ぶと、ウィンドウが何とか閉じてしまうことが分かりました。 PTSは常に更新されています。FYIOpenGL - VBOが変更されたことを頂点シェーダに伝える

glGenBuffers(1, &vertex_buffer); 
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(pts[0]) * pts.size(), NULL, GL_DYNAMIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

vertex_shader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL); 
glCompileShader(vertex_shader); 

fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL); 
glCompileShader(fragment_shader); 

program = glCreateProgram(); 
glAttachShader(program, vertex_shader); 
glAttachShader(program, fragment_shader); 
glLinkProgram(program); 

mvp_location = glGetUniformLocation(program, "MVP"); 
vpos_location = glGetAttribLocation(program, "vPos"); 

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

while(!glfwWindowShouldClose(window)) { 
    glUseProgram(program); 

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(pts[0]) * pts.size(), &pts); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    mat4x4_mul(mvp, m, p); 

    glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat*) mvp); 

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); 
    glDrawArrays(GL_POINTS, 0, pts.size()); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glfwSwapBuffers(window); 
    glfwPollEvents(); 
} 

: は、以下の私のコードスニペットです。

そこには、VBOデータが更新されたことを頂点シェーダに伝える方法がありますか?

編集:更新されたコードスニペット

編集:私は頂点毎回のpts.size()数を描くことになっていますが、持っているところ一点だけがあなたのドローコールの前に画面

+4

なぜ描画する前に 'glBindBuffer'を呼び出すのですか? –

+0

私はちょうど 'glBindBuffer'がバッファ内のデータをフラッシュするというチュートリアルをたどりました。 – SydC

+2

このチュートリアルへのリンクを提供します。私はあなたが誤解していること、またはチュートリアルが馬鹿だと思っていると思います。いずれにせよ、あなたはまだ[mcve]を提供する必要があります。上記のスニペットは、何が起こっているかを知るにはあまりにも多くのものが欠けています。 –

答えて

1

右に登場しているのですglBindBuffer(GL_ARRAY_BUFFER、vertex_buffer);実際に属性ポインタ(glVertexAttribPointer())を設定する必要があります。 2番目の注意点は、GlVertexAttribPointer()がGL_ARRAY_BUFFERを指定された属性ポインタにバインドすることです。現時点でそれを呼び出すところでは、GL_ARRAY_BUFFERにバインドされるものは何もありません。

参照用GLEnum error = glGetError()はopenGLのエラー状態を返し、強力なデバッグツールです。 glewを使用している場合、glewGetErrorString()はエラーを詳細に説明するゼロ以外のエラーコードの文字列を取得します。

p.s.私の貧弱なライティングスキルには申し訳ありません。

+1

これのほとんどは間違っています。 Vertex属性の状態は、アクティブなプログラムとは完全に独立しているので、 'glUseProgram()'が呼ばれる場所は関係ありません。また、12のストライド値は、3つの浮動小数点値で構成されている場合、頂点のバイト単位のサイズであるため、正しく表示されます。ストライドは、ある頂点の**開始**と次の開始点との間のバイト数です。本当に正しいこの答えの唯一の部分は、 'GL_ARRAY_BUFFER'バインディングが' glVertexAttribPointer() 'が呼び出されたときに有効である必要があるということです。 –

+0

それでは、私は残すでしょう – 5Volt

+0

ああ私の混乱は、あなたがゼロにストライドを設定したことです。その後、頂点はしっかりとパックされていると見なされますが、ゼロは単に仮定を意味します – 5Volt

関連する問題