3

私はウェブ上で次のような多くの例を見ました(例えば

  • FBOを作成してバインドする
  • バッファの作成とバインド(テクスチャ、レンダリング、深度、ステンシル)
  • 次に、BUFFERSのバインドを解除します
  • FBOを使用するには-FBOをバインドし、作業を行ってからFBOをバインド解除します
  • ただし、読み取り、書き込みなどのテクスチャBUFFERをテクスチャBUFFERにバインドすることもできます。
  • しかし、他のバッファ(レンダリング、深さ、ステンシル)の再バインドは決して見られません。なぜですか?

BUFFERSの作成とバインド/アンバインドの例(以下のコードは、私が説明した内容を示すためだけのものであり、完全に機能します)、

// create a framebuffer object, you need to delete them when program exits.
glGenFramebuffersEXT(1, &fboId);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);

// create color buffer object and attached to fbo
glGenRenderbuffersEXT(1, &rboId);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboId);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGB, TEXTURE_WIDTH, TEXTURE_HEIGHT);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); //UnBind

if(useDepthBuffer) {
  glGenRenderbuffersEXT(1, &rboIdDepth);
  glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboIdDepth);
  glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, TEXTURE_WIDTH, TEXTURE_HEIGHT);
  glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); //UnBind
}

glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, rboId);
if(useDepthBuffer)
  glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, rboIdDepth);


// check FBO status
printFramebufferInfo();
bool status = checkFramebufferStatus();
if(!status)
  fboUsed = false;
.
//then,
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
// Do the work
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

1.なぜ、すべてのBUFFERを再度バインドする必要がないのですか(つまり、オブジェクトの操作/描画中にFBOにバインドする必要があります)。

2.ここで内部で何が起こっているのですか?

編集:アタッチ->バインドおよびデアタッチ->バインド解除

4

2 に答える 2

8

私があなたを完全に理解しているかどうかはわかりませんが、アタッチメント ポイント ( GL_COLOR_ATTACHMENT...) にバインドされたレンダーバッファーは FBO ごとの状態であり、この FBO の状態は変更されません。FBO をバインドして OpenGL にこの FBO が現在であることを伝えるだけで済みます。使用され、そのすべての状態 (以前に設定したもの) が有効になります。

于 2011-05-26T21:18:22.553 に答える
3

で考える

  • 次に、BUFFERS を取り外します。

あなたはこれを参照してください

glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, rboIdDepth);

ただし、これは detach ではなく、unbindであり、別のことを意味します。レンダバッファはまだ FBO にアタッチされています。ただし、バインディングは、次のバッファ オブジェクト操作が実行されるバッファ オブジェクトを選択します。withいくつかの言語で見られるステートメントのようなものです。

バインドする必要のないバッファ オブジェクトの実際のアタッチは、ここで行われます。

glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
                             GL_COLOR_ATTACHMENT0_EXT, 
                             GL_RENDERBUFFER_EXT, 
                             rboId ); // rboID != 0

マッチングにより切り離されます

glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
                             GL_COLOR_ATTACHMENT0_EXT, 
                             GL_RENDERBUFFER_EXT, 
                             0 );
于 2011-05-26T22:12:16.143 に答える