2017-04-22 11 views
0

私は、反復的にいくつかの微分方程式を解く必要がある流体シミュレータを書くことを試みています(格子 - ボルツマン法)。私はOpenGLを使ってそれをリアルタイムでグラフィカルに表示したいと思っています。私は問題に遭遇した。私はGPUで関連する計算を実行するためにシェーダーを使用します。時間tでのシステムの状態を表すテクスチャをシェーダに渡すことは何ですか、シェーダは計算を実行し、時刻t + dtでシステムの状態を返し、テクスチャをクワッド上にレンダリングしてテクスチャを渡しますシェーダーに戻ります。しかし、同じテクスチャを同時に読み書きすることができないことがわかりました。しかし、私はGPU上でそのような計算の実装を見てきたと確信しています。どのように彼らはそれを回避するのですか?私は、OpenGLが同じテクスチャを読み書きできるという事実を回避する別の方法についていくつかの議論をしたと思いますが、私はそれらをかなり理解できず、私の場合に適応させることができませんでした。私が使用してテクスチャにレンダリングするには:ここでglFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0);OpenGLの反復DEソルバのための同じテクスチャからの書き込みと読み込み

は私のレンダリングルーチンです:今起こる

do{ 


    //count frames 
    frame_counter++; 


    // Render to our framebuffer 
    glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName); 
    glViewport(0,0,windowWidth,windowHeight); // Render on the whole framebuffer, complete from the lower left corner to the upper right 

    // Clear the screen 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Use our shader 
    glUseProgram(programID); 
    // Bind our texture in Texture Unit 0 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, renderTexture); 


    glUniform1i(TextureID, 0); 

    printf("Inv Width: %f", (float)1.0/windowWidth); 
    //Pass inverse widths (put outside of the cycle in future) 
    glUniform1f(invWidthID, (float)1.0/windowWidth); 
    glUniform1f(invHeightID, (float)1.0/windowHeight); 

    // 1rst attribute buffer : vertices 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); 
    glVertexAttribPointer(
          0,     // attribute 0. No particular reason for 0, but must match the layout in the shader. 
          3,     // size 
          GL_FLOAT,   // type 
          GL_FALSE,   // normalized? 
          0,     // stride 
          (void*)0   // array buffer offset 
         ); 

    // Draw the triangles ! 
    glDrawArrays(GL_TRIANGLES, 0, 6); // 2*3 indices starting at 0 -> 2 triangles 

    glDisableVertexAttribArray(0); 
    // Render to the screen 
    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
    // Render on the whole framebuffer, complete from the lower left corner to the upper right 
    glViewport(0,0,windowWidth,windowHeight); 

    // Clear the screen 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Use our shader 
    glUseProgram(quad_programID); 

    // Bind our texture in Texture Unit 0 
    glActiveTexture(GL_TEXTURE0); 
    glBindTexture(GL_TEXTURE_2D, renderedTexture); 
    // Set our "renderedTexture" sampler to user Texture Unit 0 
    glUniform1i(texID, 0); 

    glUniform1f(timeID, (float)(glfwGetTime()*10.0f)); 

    // 1rst attribute buffer : vertices 
    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); 
    glVertexAttribPointer(
          0,     // attribute 0. No particular reason for 0, but must match the layout in the shader. 
          3,     // size 
          GL_FLOAT,   // type 
          GL_FALSE,   // normalized? 
          0,     // stride 
          (void*)0   // array buffer offset 
         ); 

    // Draw the triangles ! 
    glDrawArrays(GL_TRIANGLES, 0, 6); // 2*3 indices starting at 0 -> 2 triangles 

    glDisableVertexAttribArray(0); 

    glReadBuffer(GL_BACK); 
    glBindTexture(GL_TEXTURE_2D, sourceTexture); 
    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, windowWidth, windowHeight, 0); 


    // Swap buffers 
    glfwSwapBuffers(window); 
    glfwPollEvents(); 



} 

何を、私は、私はフレームバッファにレンダリングするとき、私は、入力として取得Iテクスチャが空であるということです思う。しかし、私は同じテクスチャをスクリーンにレンダリングすると、私が目にしているものをうまく描画します。

+1

通常、携帯電話の自動化などでは、読み込みと書き出しの2つのバッファを使用してスワップします。それらは各フレームの後にある。それはあなたのための選択肢ではありませんか? –

+0

@JanDvorakはい、私はそれがまさに私が探しているものだと思います。私はその実装についてちょっと混乱しています。 –

答えて

0

さて、私は何かを把握することができたと思う。フレームバッファにレンダリングする代わりに、glCopyTexImage2Dを使用して、スクリーン上にレンダリングされたものをテクスチャにコピーすることができます。しかし今、別の問題があります:glCopyTexImage2Dがフレームバッファで動作するかどうかはわかりません。それは画面上のレンダリングで動作しますが、フレームバッファにレンダリングしているときには動作しません。これが最初でも可能であるかどうかは不明です。 Does glCopyTexImage2D work when rendering offscreen?

関連する問題