4

最初 -サブルーチンには GLSL 4.0+ が必要ですか? では、OpenGL ES 2.0 の GLSL バージョンでは使用できませんか?

マルチパス シェーダーとは何かをよく理解しています。
さて、私の写真は何ですか:

  1. シェーダーを使用して、何かのグループ (スプライトなど) を FBO に描画します。
  2. FBO を大画面サイズのクワッドの大きなテクスチャと考えて、別のシェーダを使用します。たとえば、テクスチャ カラーをグレースケールに変換します。
  3. FBO テクスチャ クワッドをグレースケール カラーで画面に描画します。

それとも、これは他と呼ばれますか?

つまり、マルチパス = 別のシェーダー出力を別のシェーダー入力に使用しますか? では、1 つのオブジェクトを 2 回以上レンダリングしますか? シェーダー出力が別のシェーダー入力に到達する方法は?

例えば

glUseProgram(shader_prog_1);//Just plain sprite draw
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, /*some texture_id*/);
 //Setting input for shader_prog_1
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
//Disabling arrays, buffers
glUseProgram(shader_prog_1);//Uses same vertex, but different fragment shader program
//Setting input for shader_prog_2
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

誰でも基本的な方法でこれの簡単な例を提供できますか?

4

1 に答える 1

10

一般に、「マルチパス レンダリング」という用語は、同じオブジェクトを異なるシェーダーで複数回レンダリングし、その結果をフレーム バッファーに蓄積することを指します。蓄積は通常、シェーダーではなくブレンドによって行われます。つまり、2 番目のシェーダーは最初のシェーダーの出力を受け取りません。それらはそれぞれ計算の一部を実行し、ブレンド ステージはそれらを最終的な値に結合します。

現在、これは主にフォワード レンダリング シナリオのライティングで行われています。ライトごとに各オブジェクトを 1 回レンダリングし、異なるライティング パラメータを渡し、ライトをレンダリングするたびに異なるシェーダーを使用する可能性があります。光の反射率は加法的プロパティであるため、結果を蓄積するために使用されるブレンド モードは加法的です。

サブルーチンには GLSL 4.0+ が必要ですか? では、OpenGL ES 2.0 の GLSL バージョンでは使用できませんか?

これは、投稿の残りの部分とはまったく異なる質問ですが、答えは「はい」と「いいえ」です。

いいえ、ARB_shader_subroutine は OpenGL 拡張機能であるため、任意の OpenGL 実装で実装できるという意味ではありません。はい、実際には、shader_subroutineを実際に実装できるハードウェアはすべて GL 4.x の残りの部分も実装できるため、4.x の機能を既に宣伝しているという意味です。

実際には、4.x 以外の OpenGL 実装でサポートされている shader_subroutine は見つかりません。

GLSL ES であるため、GLSL ES 2.0 では使用できませデスクトップ OpenGLと OpenGL ESを混同しないでください。これらは 2 つの異なるものであり、異なる GLSL バージョンと異なる機能セットを備えています。彼らは拡張機能さえ共有していません(ごく少数の最近のものを除いて)。

于 2012-09-28T19:06:53.120 に答える