2

後処理の仕組みを理解しようとしています。

私が理解したことから、私はそのようなことをする必要があります:

-> Bind render texture
-> Draw my scene
-> Unbind render texture
-> Draw a quad full screen using the resulting texture using a shader to apply an effect (blur, …)

そのシステムの問題は、結果のクワッドに複数の効果を適用するにはどうすればよいですか?

私の考えでは、結果のテクスチャに「エフェクト」(シェーダー) を適用してからクワッドを描画するのがおそらく最良の解決策だと思いますが、それが可能かどうかはわかりません。

シェーダーをテクスチャに直接適用できますか?

PS: 現時点で行ったことは次のとおりです。現在、すべてのシーンをテクスチャで描画できます。

  • PostEffect クラス (適用する効果)

  • EffectManager (出力テクスチャを作成し、メソッド「add(PostEffect*)」を用意します)

4

2 に答える 2

2

シェーダーをテクスチャに「直接適用する」とはどういう意味かわかりませんが、特殊効果でテクスチャをレンダリングするには、必要なシェーダーを使用してフルスクリーンのクワッドを画面にレンダリングし、もちろんテクスチャをフィードする必要がありますシェーダー。複数の効果を得るには、次のように 2 つのフレームバッファ (ピンポン) を使用する必要があります。

-> Bind 1st render texture
-> Draw scene

-> Bind 2nd render texture
-> Feed 1st render texture to a shader and draw quad

-> Bind 1st render texture
-> Feed 2nd render texture to another shader and draw quad

-> Bind 2nd render texture
-> Feed 1st render texture to a third shader and draw quad

...
-> Unbind
-> Draw quad

同じフレームバッファに 2 回続けてレンダリングすることはできないため、この方法を実行する必要があります ( https://www.opengl.org/wiki/Framebuffer_Object#Feedback_Loopsを参照)。

可能であれば、できるだけ多くのエフェクトを同じシェーダーにパックして、ユニフォームをフィードして描画するときのオーバーヘッドを最小限に抑えます。

于 2015-02-16T21:12:34.173 に答える
1

後処理のテクニックは、何を達成したいかによって異なります。複数の後処理効果を適用してテクスチャに一度にレンダリングする単一のシェーダーを作成するか、レンダリングが本質的にシーケンシャルである場合は、ダブル バッファーが必要です。

render to texture 1
use texture one and render to texture 2
use texture 2 and render to texture 1
etc 
etc

すべてのポスト エフェクトが適用されるまでそれを行います。ただし、最終パスを画面レンダー バッファーに直接レンダリングして、コストのかかるテクスチャーの画面レンダー バッファーへの「コピー」を回避する必要があります。

シェーダーをテクスチャに直接適用できますか?

それが何を意味するのかさえわかりません。シェーダーが使用されるのは、FBO と RBO を正しく作成したと仮定して、glDrawArrays または glDrawElements を介して描画呼び出しを行うときだけです。そうです、ある種の全画面表示技術を使用する必要があります。

于 2015-02-16T21:12:46.317 に答える