1

openGL es 2.0 と GLSL シェーダーを使用してオフスクリーン レンダリングを使用したい
FBO をセットアップしたところ、2 つの問題を除けば動作しているようです

1) プログラムは約 30 fps で進みますが、突然 20 fps に落ちてから再び 30 fps に戻り、数秒後に再び 20 fps に落ちてから 30 fps に戻ります... (続きが続きます)このランダムな一時停止/遅延の原因がわかりません
2) アプリケーションを閉じると、しばらく応答しません。言い換えれば、クリーンアップするデータや遅延があるようです...そのため、プログラムを閉じると、数秒後まで閉じられません。

私は何か間違ったことをしていますか?とにかく私はこれらを修正できますか?
これが私のコードです:

私の初期化機能:

glGenFramebuffers(1,&frameBuf);
glGenRenderbuffers(1,&renderBuf);
glBindRenderbuffer(GL_RENDERBUFFER,renderBuf);
glRenderbufferStorage(GL_RENDERBUFFER,GL_RGBA4,640,480);
glBindRenderbuffer(GL_RENDERBUFFER,0);
glBindFramebuffer(GL_FRAMEBUFFER,frameBuf);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_RENDERBUFFER,renderBuf);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status != GL_FRAMEBUFFER_COMPLETE)
    printf("GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT\n");
else
    printf("COMPLETE\n");

glBindFramebuffer(GL_FRAMEBUFFER,0);

私の描画機能:

glBindFramebuffer(GL_FRAMEBUFFER, frameBuf);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

GLfloat vertices1[] = {
    -1.0,-1.0,-1.0, 1.0,-1.0,-1.0, -1.0,1.0,-1.0,
    1.0, 1.0,-1.0, -1.0,1.0,-1.0, 1.0,-1.0,-1.0
};
glVertexAttribPointer(vertexAttr1, 3, GL_FLOAT, GL_FALSE, 0, vertices1);
glEnableVertexAttribArray(vertexAttr1);
GLfloat texCoord[] = {
    0.0f,0.0f, 1.0f,0.0f, 0.0f,1.0f,
    1.0f,1.0f, 0.0f,1.0f, 1.0f,0.0f
};

glVertexAttribPointer(texCoordAttr1, 2, GL_FLOAT, GL_FALSE, 0, texCoord);
glEnableVertexAttribArray(texCoordAttr1);

glDrawArrays(GL_TRIANGLES, 0, 6);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
4

1 に答える 1

3

パフォーマンスに役立つ可能性のあるいくつかのことを次に示します。

  • glClearColor()init 関数で一度だけ呼び出す必要があります。
  • init 関数で GLFloat 配列を 1 回だけ作成し、VBO に格納してレンダリングに使用します。これにより、フレームごとにバスを介してすべての頂点データを GPU に送信する必要がなくなります。
  • 呼び出しを init に移動しglEnableVertexAttribArray()ます。フレームごとに再度有効にする必要はありません。
  • この場合、フレームバッファをアンバインドする必要はありません。glBindFramebuffer()これにより、ドローの開始時にコールも取り除かれます。
  • init で VAO を生成し、それを使用して draw メソッドの残りのほとんどを置き換えます。

また、あなたのシェーダーを見せていただければ幸いです。組み込みシステムの多くは、フラグメント シェーダーではあまり高速ではありません。シェーダーがここで問題になる可能性があります。

ああ、いつ電話するのglUseProgram()

于 2011-12-30T13:30:03.527 に答える