+ +核グレーフレームバッファ(コンボリューション行列)+ +ファジィエッジ検出

ここでは、難易度が高くなって、より高度なトピックに来ます

A:フレームバッファ

  1. カラー値、書き込み奥行き情報の深度バッファをカラーバッファを書き込むため、私たちは、いくつかの条件ステンシルバッファに基づいて特定のセグメントを破棄することを可能にします。組み合わせは、メモリに格納されるフレームバッファのバッファ(フレームバッファ)と呼ばれています。OpenGLは、私たち自身のフレームバッファを定義するために私達を許可します
  2. 私たちは、すべての操作が行われ、バッファをレンダリングするデフォルトのフレームバッファで行われています。あなたは(GLFW私たちはこれらを行うために役立つ)のウィンドウを作成するときにデフォルトのフレームバッファが生成され、構成されています。私たち自身のフレームバッファで、我々はレンダリングするより多くの方法を持つことができます
  3. フレームバッファを作成します。
    3.1私たちが作成するglGenFramebuffersと呼ばれる機能を使用するフレームバッファオブジェクト(フレームバッファオブジェクト、FBO)を。
    まず3.2は、我々はフレームバッファオブジェクトを作成し、それがフレームバッファをアンバンドリングした後、何かをする、アクティブ(能動)フレームバッファにバインドします。私たちは、glBindFramebufferフレームバッファをバインドするために使用されます。
    標的に結合した3.3 GL_FRAMEBUFFERした後、すべての読み取りとフレームバッファへの書き込み現在バインドされているフレームバッファの動作に影響を与えます。
    3.4完全なフレームバッファは、以下の条件を満たしている必要があります。
    • 少なくとも1つの追加のクッション(色、深さまたはステンシルバッファ)。
    • 少なくとも1つの色アタッチメント(添付)。
    • すべての添付ファイルは、完全な(予約済みメモリ)でなければなりません。
    • 各バッファは、サンプルの数が同じでなければなりません。
    3.5当社は、フレームバッファに取り付けたいくつかのフレームバッファへの付着、および附属書を作成する必要があります。すべての条件が完了した後、我々は、パラメータとしてglCheckFramebufferStatusを呼び出すGL_FRAMEBUFFERフレームバッファが完了し確認することができます。これは、フレーム現在結合バッファ、及びこれらのいずれかの値を返すの指定を検出します。それはGL_FRAMEBUFFER_COMPLETEを返した場合、フレームバッファがいっぱいです。
    3.6 すべてのレンダリング操作した後は、現在バインドされているフレームバッファ内の添付ファイルをレンダリングします。そのため、デフォルトのフレームバッファよりも私たちのフレームバッファの、レンダリング視覚出力命令は、ウィンドウ上の任意の影響を与えることはありません。この理由のため、異なるフレーム・バッファは、オフスクリーンレンダリング(オフスクリーンレンダリング)と呼ばれるレンダリングします。メインウィンドウで操作をレンダリングするすべての視覚効果は、我々は0にバインドするために、デフォルトのフレームバッファを再有効化する必要があることを確認してください。
    3.7すべてのフレームバッファ操作した後、フレームバッファオブジェクトを削除することを忘れないでください:
    3.8以前の整合性チェックの実施に、我々は、フレームバッファへの添付ファイルを添付する必要があります。メモリロケーションがある取り付け、それはフレームバッファのバッファとして使用することができ、これは、1枚の画像と考えることができます。テクスチャやバッファオブジェクト(レンダオブジェクト)をレンダリングする:添付ファイルを作成するとき、我々は2つのオプションがある場合。
  4. テクスチャ別館:
    4.1 テクスチャがすべての描画命令をテクスチャに書き込まれるフレームバッファに添付され、それがテンプレートとして通常のカラー/または深度バッファを望まれています。テクスチャを使用することの利点は、すべてのレンダリング操作の結果は、その後、我々はシェーダーで簡単にそれを使用することができ、テクスチャ画像に格納されるということです。
    通常と同様のテクスチャを作成するために、フレームバッファとテクスチャを作成するために4.2:主な違いは、(これは必要ではないが)、我々は、画面サイズの寸法を設定することであり、我々はNULL渡されるテクスチャデータパラメータを与えます。このテクスチャのために、我々はそれを充填せずにメモリを割り当てます。私たちは、その後に行われたフレームバッファをレンダリングするためにこのテクスチャを記入します。また、我々は、サラウンドモードまたはマルチステージのテクスチャを気にしないと遠く、私たちはほとんどの場合、それらを必要としないことに注意してください。
    4.3今、私たちはテクスチャを作成したことを、実行する最後のものは、フレームバッファに添付している:glFramebufferTexture2D(GL_FRAMEBUFFER、GL_COLOR_ATTACHMENT0、GL_TEXTURE_2D、テクスチャ、0);
    4.4 glFrameBufferTexture2Dには、以下のパラメータがあります。
    • ターゲット:ターゲット・フレーム・バッファ(描画、または両方読み取り)
    • 添付ファイル:我々は、添付ファイルの種類を添付したいです。私たちは、色のアクセサリーを、現在接続しています。0の最後には、我々は、複数の色の添付ファイルを添付することができることを意味していることに注意してください。私たちは、このチュートリアルで後述します。
    • textarget:あなたはテクスチャタイプに添付する
    • テクスチャ:あなたは自分自身を添付したいテクスチャ
    • レベル:マルチレベル遠くのテクスチャのレベル。我々はゼロにそれを残します。
    色に4.5附属書に加え、我々はまた、深度ステンシルバッファフレームバッファオブジェクトにテクスチャを添付する。デプスバッファを添付するには、我々はGL_DEPTH_ATTACHMENTへの添付ファイルの種類になります。デプスバッファ記憶フォーマットを反映するために、テクスチャフォーマット(形式)と内部フォーマット(Internalformat)タイプGL_DEPTH_COMPONENTなることに留意されたいです。ステンシルバッファを添付するには、あなたがしたい二番目のパラメータはGL_STENCIL_ATTACHMENTに設定され、テクスチャフォーマットはGL_STENCIL_INDEXに設定されています。
    4.6及び深さバッファは、別個のバッファテンプレートテクスチャとして取り付けられてもよいです。テクスチャ情報と8テンプレート情報の24ビット深度を含む各32ビット値。テクスチャとして添付深度およびステンシルバッファに、我々はGL_DEPTH_STENCIL_ATTACHMENT型を使用し、フォーマットや質感、奥行き及びステンシル値を設定するには、マージされたが含まれています。
  5. バッファ・オブジェクトの添付をレンダリング
    アタッチメントの種類としてフレームバッファ内のOpenGLテクスチャが利用可能であるので、過去にのみ利用可能なアタッチメントテクスチャ後にバッファ・オブジェクト(レンダオブジェクト)が中に導入されるレンダリング5.1。同じテクスチャ画像は、バッファ・オブジェクトをレンダリングは実際のバッファ、すなわち、バイトの数、整数、ピクセル等です。バッファオブジェクトがレンダリングされる追加の利点は、それが最適化されたオフスクリーンフレームバッファにレンダリングされるネイティブフォーマットを、レンダリングするOpenGLのためのデータを格納します。
    5.2テクスチャのための任意の変換フォーマットをしないだろう、バッファをレンダリングするためにすべてのデータを保存するために、直接バッファオブジェクトをレンダリングし、それはすぐに書き込み可能な記憶媒体となります。しかし、レンダリングバッファオブジェクトは、通常は書き込み専用されているので、あなたは(たとえば、テクスチャのアクセスを使用して)それらを読むことができませんもちろん、あなたはまだglReadPixelsはまだそれを読んで使用することができ、それは現在附属書自体は、ピクセルの特定の領域に返されるのではなく、バインドされたフレームバッファからだろう。
    5.3 データをネイティブ形式で既にある、または他のバッファにデータを書き込むことは非常に高速であるときにそれをコピーしているためこのような操作を使用してオブジェクトをレンダリングするときしたがって、緩衝液交換緩衝液は非常に高速になります。我々 glfwSwapBuffersが最後に使用され、各反復をレンダリング、また、バッファオブジェクトをレンダリングすることによって達成することができます:ちょうどレンダリング画像バッファを書き、最後にその上に別のレンダリングバッファに切り替えます。
    5.4コードおよびオブジェクトコードフレームバッファレンダリングのバッファを作成することは非常に類似しています。すべてのバッファ動作と同様の影響をレンダリングし、我々は現在のRBO後のように、レンダリングバッファオブジェクトをバインドする必要があります。
    5.5それはもう少し最適化されることになるので、我々は、通常、バッファオブジェクトをレンダリングすることを選択し、バッファからこれらのサンプルを必要としません。
    デプスとステンシルバッファオブジェクトのレンダリングを作成する5.6はglRenderbufferStorage関数を呼び出すことによって行うことができます。
    5.7オブジェクトは、特に画像、しないなどの一般的なテクスチャ・データ・バッファ(汎用データ・バッファ)として使用するために設計されていることを除いて、バッファオブジェクトとテクスチャ類似のオブジェクトをレンダリングを作成します。ここでは、24ビットと8ビットの深度ステンシルバッファをカプセル化して内部フォーマットとしてGL_DEPTH24_STENCIL8を選択します。
    5.8最後のものは、この追加はバッファオブジェクトをレンダリングします。
  6. レンダリングバッファオブジェクトは、フレームバッファオブジェクトのいくつかの最適化を提供しますが、バッファオブジェクトをレンダリングする際に使用するテクスチャを使用することは非常に重要であるとき、知ることができます。
    6.1 一般的なルールは、あなたがバッファからデータをサンプリングする必要がない場合は、賢明な選択となるバッファオブジェクトをレンダリングするために、このバッファを使用し、です。
    6.2 あなたはデプスバッファ値から色データ等をサンプリングする必要がある場合は、その後、あなたはテクスチャの添付ファイルを選択する必要があります。パフォーマンスに関しては、それは非常に大きな影響を与えることはありません。

2:テクスチャへのレンダリング

  1. 私たちは、これは画面全体に四角形全体にテクスチャを描画します、テクスチャのカラーフレームバッファオブジェクトにレンダリングするシーンに追加されます。フレームバッファを使用していなかったような視覚的な出力とはまったく同じですが、今回は四辺形で印刷します。
  2. 第1のフレームバッファオブジェクトを作成し、それを結合し、これらは非常に直感的です。
  3. 次に我々は、色の添付ファイルとしてフレームバッファにそれを添付します、テクスチャ画像を作成する必要があります。私たちは、ウィンドウの幅と高さにテクスチャの寸法を設定し、そのデータを初期化しません。
    // 生成纹理 unsigned int texColorBuffer; glGenTextures(1, &texColorBuffer); glBindTexture(GL_TEXTURE_2D, texColorBuffer); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, 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);
  4. また、(テンプレートのテストとしてだけでなく、それを必要とする場合)、OpenGLのデプステストにできるようにしたいので、我々はまた、フレームバッファへの深さ(テンプレート)添付ファイルを追加する必要があります。私たちは以来だけではなく、他のバッファよりも、色バッファをサンプリングしたい、我々は彼らのためにレンダリングバッファオブジェクトを作成することができます。我々はそれがより良い選択であるバッファオブジェクトをレンダリングし、サンプル・バッファを必要としないときに注意してください
  5. レンダリングバッファオブジェクトを作成することは非常に複雑ではありません。私たちが覚えておく必要がある唯一のものは、我々はそれが深さやステンシル添付ファイルのバッファオブジェクトを作成し、レンダリングすることです。私たちは私たちのために、この精度は十分であり、その内部形式のGL_DEPTH24_STENCIL8を設定します。
    unsigned int 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);
  6. 最後に、我々は、我々はエラーメッセージを出力しますない場合は、フレームバッファがいっぱいであるかどうかを確認したいです。
  7. 我々は間違ったフレームバッファにレンダリングしていないことを確認するために、アンバンドリングフレームバッファに覚えておいてください。
  8. 今、フレームバッファが完了すると、我々は、フレームバッファオブジェクトをバインドするバッファのフレームバッファではなく、デフォルトのフレームバッファにレンダリングできるようにする必要があります。フレームバッファの命令をレンダリングした後、現在の結合に影響を与えます。すべての深さとステンシル操作は、(もしあれば)現在のフレームバッファをバインド深度とステンシルの添付ファイルから読み込みます。あなたはデプスバッファを無視した場合、現在のフレームバッファバインドされたデプスバッファが存在しないので、すべてのデプステスト操作はもはや、動作しません。
  9. だから、テクスチャにシーンをレンダリングするために、私たちは、次の手順を実行する必要があります。
    • アクティブフレームバッファに結合し、そしていつものようにシーンをレンダリングするための新たなフレームバッファ
    • デフォルトのフレームバッファをバインド
    • そのテクスチャとして、画面全体のフレームバッファのバッファの色の四角形を描きます。

4:反転:

おすすめ

転載: www.cnblogs.com/GarrettWale/p/11344498.html