1

私のシェーダーには、以前にレンダリングされた画面のコンテンツ全体を含む特別な変数がすでにあります。に保存されます

uniform sampler2D _GrabTexture;

内容は次のとおりです。 画面の内容

(ちなみに、私はUnityのGrabPass {}を使用して画面全体を取得しています。また、UnityのGUIは無視してください)

平面モデルのテクスチャとして_GrabTextureを使用して、もう1つのパスをレンダリングするにはどうすればよいですか。結果は、_GrabTextureとまったく同じになりますか?

(要点は、もう一度パスをレンダリングする前に、その画面テクスチャにぼかし、シャープなどのいくつかの効果を適用できるため、平面のテクスチャが定型化されます。)

私はこれを最終パスで試しています。変数は、頂点シェーダーとフラグメントシェーダーの両方で宣言されます。

uniform sampler2D _GrabTexture;
varying vec4 v_Position;

バーテックスシェーダー:

void main()
        {
            gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
            v_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

        }

フラグメントシェーダーで使用するために、各モデルの頂点の画面座標を変化するものとして保存します。

フラグメントシェーダー:

void main()
        {
            gl_FragColor = texture2D(_GrabTexture,vec2(v_Position)); 
        }

次に、保存されているさまざまな位置を使用して、_GrabTexture画面テクスチャにアクセスします。画面全体なので、すでに画面座標にあるv_Positionは正しく正しいピクセルを取得するはずです。

しかし、結果は

ここに画像の説明を入力してください

ご覧のとおり、平面のテクスチャは、以前にレンダリングされた画面を表示する「一種の」ですが、座標が正しくありません。結果が最初の画像と同じになるように修正するにはどうすればよいですか?

4

1 に答える 1

4

あなたはあまりにも複雑に考えています。OpenGLは、変数に組み込まれているフラグメントシェーダーの画面上のフラグメント位置を示しますgl_FragCoord

GLSL-1.30以降では、ソース座標として直接指定texelFetchできます。gl_FragCoordまたは、変換gl_FragCoordをテクスチャ空間座標に使用します。https: //stackoverflow.com/a/5879551/524368を参照してください。

于 2012-11-23T10:54:28.137 に答える