画像をレンダリングするフレームバッファグラフィックスは、色、深度、ステンシルバッファを持つ添付ファイルを含む、デフォルトのフレームバッファに格納されます。
私たちは、あなた自身のフレームバッファを作成することができます。
glGenFramebuffers(1、&この - > フレームバッファ)。 glBindFramebuffer(GL_FRAMEBUFFER、この - >フレームバッファ);
私たちは、(例えば、色、深度、ステンシルバッファなど)いくつかのアクセサリを接続する必要があります。
色に関しては、我々は時々後処理をレンダリングした後に行う必要があり、その後、あなたがレンダリングされたピクセル値を取得する必要があり、この場合には良いオプションは、添付ファイルとしてカラーテクスチャを使用することです。
glGenTextures(1、&texColorBuffer); glBindTexture(GL_TEXTURE_2D、texColorBuffer); (GL_TEXTURE_2D、glTexImage2D 0、GL_RGB、800、600、0 GL_UNSIGNED_BYTEの、GL_RGB、NULL); glTexParameteri(GL_TEXTURE_2D、GL_TEXTURE_MIN_FILTER、GL_LINEAR); glTexParameteri(GL_TEXTURE_2D、GL_TEXTURE_MAG_FILTER 、GL_LINEAR); glBindTexture(GL_TEXTURE_2D、0 ); // 現在結合フレーム・バッファ・オブジェクトに添付 glFramebufferTexture2D(GL_FRAMEBUFFER、GL_COLOR_ATTACHMENT0、GL_TEXTURE_2D、texColorBuffer、0);
我々はそれを取得しない深さとステンシル値は、我々は深さやステンシル添付ファイルのレンダリングバッファオブジェクトを使用して、ライン上でそれを自分でシステムの深さやステンシルテストを行います。
符号なし整数RBO; glGenRenderbuffers(1、&RBO); glBindRenderbuffer(GL_RENDERBUFFER、RBO); glRenderbufferStorage(GL_RENDERBUFFER、GL_DEPTH24_STENCIL8、800、600 ); glBindRenderbuffer(GL_RENDERBUFFER、0 ); // フレームバッファ及び深さバッファ・オブジェクトをレンダリングテンプレートのアクセサリー glFramebufferRenderbuffer(GL_FRAMEBUFFER、GL_DEPTH_STENCIL_ATTACHMENT、GL_RENDERBUFFER、 RBO)。
私たちが作成したフレームバッファが完了したチェック
// 检查帧缓冲是否完整 場合(!glCheckFramebufferStatus(GL_FRAMEBUFFER)= GL_FRAMEBUFFER_COMPLETE) のstd :: coutの << " ERROR :: FRAMEBUFFER ::フレームバッファが完了していません!" << はstd ::てendl; 他のstd :: coutの<< " 成功::フレームバッファが完了している... " <<はstd ::てendl;
レンダリングする場合、フレームバッファを使用する最初の私たちは、カラーテクスチャをレンダリングするためにシーンを作成しました。フレームバッファは、テクスチャが画面に直接レンダリングし、フラグメントシェーダで行う後処理において、バックデフォルト画面のフレームバッファに変更されます。
空SceneRendering ::ドロー(){ // 最初のプロセス段階(パス) glBindFramebuffer(GL_FRAMEBUFFER、この - > フレームバッファ); glClearColor(0.1F、0.1F、0.1F、1.0F ); にglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); / / 私たちは、ステンシルバッファを使用しないでください glEnableです(GL_DEPTH_TESTを); この - > NormalBlendRendering(); // 第二の処理段階 glBindFramebuffer(GL_FRAMEBUFFER、0); //はデフォルト返し glClearColor(1.0F、1.0Fを、1.0F、1.0F )。 glClear(GL_COLOR_BUFFER_BIT)。 またはglDisable(GL_DEPTH_TEST)。 この - > shader_quad-> ()を使用します。 glBindTexture(GL_TEXTURE_2D、この - > texColorBuffer); クワッド - > ドロー(); }
いくつかの後処理の効果を示します:
1、インバータ、と1 - 色
2、重み付け3つの色成分の階調出力RGB
図3に示すように、コア処理
#version 330 コア アウトFragColor vec4。 中VEC2のTexCoords。 均一sampler2D screenTexture。 constの フロートオフセット= 1.0F / 300.0f 。 ボイドメイン() { VEC2オフセット[ 9 ] = VEC2 []( VEC2( -offset、オフセット)、 // 左上 VEC2(は0.0f、オフセット)、// 正上 VEC2(オフセット、オフセット)、// 右上 VEC2( -offset、 は0.0f)、 // 左 VEC2(0.0f、 は0.0f) // VEC2(、オフセット は0.0fを)、 // 右 VEC2(-offset、-offset)、// 左下 VEC2(は0.0f、-offset)、// 直下 VEC2(オフセット-offset) // 右下 ;) フロート [カーネル9 ] = フロート[]を( 1、1、1 、 1、 - 8。 、1 、 1、1、1。 ); vec3 sampleTex [ 9 ]。 以下のために(int型 i = 0 ; iは< 9 ; iは++ ) { sampleTex [I] = vec3(テクスチャ(screenTexture、TexCoords.stは+ オフセット[I]))。 } vec3 COL = vec3(0.0 )。 以下のために(int型 i = 0 ; iは< 9 ; iは++ ) COL + = sampleTex [I] * カーネル[I]。 FragColor = vec4(COL、1.0 )。 }
シャープ:
ブラー:
エッジ検出: