参考ます。https://learnopengl.com/Advanced-OpenGL/Framebuffers
ステップ:
レンダリングバッファオブジェクトを作成します- 「オブジェクトバッファレンダリングバインディング- 」メモリを割り当てるために、レンダリングバッファオブジェクトとして- 「フレームバッファと結合バッファーをレンダリング
レンダオブジェクトは、テクスチャの後にOpenGLに導入された
フレームバッファの添付ファイルの可能なタイプとして、
そのテクスチャは古き良き時代に使用される添付ファイルのみでした。
単にテクスチャ画像と同様に、レンダ・オブジェクトは各工場バッファー、例えばバイト、整数、ピクセルまたは任意の配列です。
それにもかかわらずレンダオブジェクトが追加利点があり
、それがフレームバッファへのオフスクリーンレンダリング用に最適化することにOpenGLのネイティブレンダリング形式でそのデータを格納します。用于离屏渲染
レンダ・オブジェクトは、そのバッファに直接レンダリングする全てのデータを格納
、テクスチャ固有の形式への変換なしに
高速書き込み可能な記憶媒体としてそれらを作る、こうして。
しかし、レンダオブジェクトは、一般的にwirte専用です
ので、uは(テクスチャアクセスと同じように)そこから読み取ることができません。
そのリターンが画素の領域を指定してもglReadPixelsを経由して、そこから読み取ることが可能である
が、直接ではなく、添付ファイル自体から、現在バインドされたフレームバッファから。
优点:
そのデータはネイティブフォーマットに既にあるbecuaseデータを書き込むか、単に他のバッファにデータをコピーするとき、彼らは非常に高速です。
レンダオブジェクトを使用する場合、バッファを切り替えるなどの操作は非常に高速ですので。
:glfwSwapBuffersは、私たちはそれぞれの反復が同様にレンダオブジェクトで実装されるかもしれないレンダリングの最後に使用してきた機能
我々は単にレンダの画像に書き込み、そして最後に、他の1へのスワップ。
レンダオブジェクトは、これらの操作の種類に最適です。
- レンダ対象オブジェクトのメソッドを作成します:
unsigned int rbo;
glGenRenderbuffers(1, &rbo);
- オブジェクトバッファレンダリング結合:
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
レンダオブジェクトは、一般的に書き込み専用であるため、彼らはしばしば、深さやステンシルの添付ファイルとして使用されている
私たちは本当に深さやステンシルバッファから値を読み取るが、それでも深さやステンシルテストを気にする必要はありませんほとんどの時間以来。
我々はテストのための深さとステンシル値を必要とするが、これらの値をサンプリングする必要はありません
レンダオブジェクトスーツので、この完璧。
私たちはこれらのバッファからサンプリングされていないとき、
それはより最適化されていますので、レンダ対象は、一般的に好ましいです。
- オブジェクトのメモリ割り当てにレンダオブジェクト、多くを行うための割り当て
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 800, 600);
どのように我々はそれを理解することができますか?
GL_RENDERBUFFER--説明このストレージは、関連レンダ対象である
メモリ深さとテンプレート使用して、このメモリを示すGL_DEPTH24_STENCIL8--
800及び600--のバッファのサイズがはるかにある例示
レンダ・オブジェクトを作成するテクスチャオブジェクトは、このオブジェクトがされていることである差と同様であり
、具体的に、画像として使用されるように設計
代わりに、テクスチャのような汎用データバッファ。
ここではGL_DEPTH24_STENCIL8を選択した
それぞれ24および8ビットで深さとステンシルの両方を保持intenalフォーマットとして。
- 最後に、フレームと関連するオブジェクト:
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
ときにレンダリングバッファオブジェクトを使用するには:
レンダオブジェクトは、あなたのフレームバッファのプロジェクトにいくつかの最適化を提供することができますが、使用テクスチャにレンダオブジェクトとするときに使用する際に認識することが重要です。一般的なルールはということです
- あなたが特定のバッファからのサンプルデータをする必要はありません場合は、その特定のバッファにレンダオブジェクトを使用するのが賢明です。
- あなたは色や深さの値のような特定のバッファからいつかのサンプルデータに必要がある場合は、代わりにテクスチャアタッチメントを使用する必要があります。パフォーマンスワイズそれはしかし巨大な影響力を持っていません。
実際の例:
//帧缓冲区对象
glGenFramebuffers(1,& fboId);
glBindFramebuffer(GL_FRAMEBUFFER,fboId);
//1.渲染缓冲区作为颜色缓冲区
glGenRenderbuffers(1,& colorBuffer);
glBindRenderbuffer(GL_RENDERBUFFER,colorBuffer);
glRenderbufferStorage(GL_RENDERBUFFER,GL_RGBA,width,height);
glBindRenderbuffer(GL_RENDERBUFFER,0);
//将渲染缓冲区作为颜色缓冲区附加到fbo
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_RENDERBUFFER,colorBuffer);
//2.将缓冲区渲染为深度缓冲区
glGenRenderbuffers(1,& depthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER,depthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH_COMPONENT,width,height);
glBindRenderbuffer(GL_RENDERBUFFER,0);
//将渲染缓冲区作为深度缓冲区附加到fbo
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_RENDERBUFFER,depthBuffer);
//3.将缓冲区渲染为模板缓冲区
glGenRenderbuffers(1,& stencilBuffer);
glBindRenderbuffer(GL_RENDERBUFFER,stencilBuffer);
glRenderbufferStorage(GL_RENDERBUFFER,GL_STENCIL_INDEX,width,height);
glBindRenderbuffer(GL_RENDERBUFFER,0);
//将渲染缓冲区附加到fbo作为模板缓冲区
glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_STENCIL_BUFFER,GL_RENDERBUFFER,stencilBuffer);