私はウェブ上で次のような多くの例を見ました(例えば)
- 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.ここで内部で何が起こっているのですか?
編集:アタッチ->バインドおよびデアタッチ->バインド解除