0

次のフラグメント シェーダーの実行中にエラーが発生します。

#version 430 core

in vec4 pos;           // <-- input (x,y,z) position normalized to [0, 1] 
in vec4 screenPos;     // <-- input screen position normalized to [-1, 1] 
out vec4 outColor;

uniform sampler3D volumeTex;    // <-- a volume
uniform sampler2D backFaceTex;  // <-- the backface of a cube previously saved to texture

void main()
{
    if(gl_FrontFacing) {
        vec4 front = pos;
        vec4 back = texture(backFaceTex, (screenPos.xy/screenPos.w+1.0)/2.0);

        // only one of the following 4 lines is uncommented at a time
        outColor = front;                          // <-- Ok
        outColor = back;                           // <-- Ok
        outColor = texture(volumeTex, front.xyz);  // <-- Ok
        outColor = texture(volumeTex, back.xyz);   // <-- Error
    }
    else {
        discard;
    }
}

私のコメントから読み取れるように、最初の 3 つのケースではプログラムは正常に動作し、期待どおりの画像をレンダリングしますが、4 つ目のケース (必要な唯一のもの) では失敗します。

何もレンダリングされず、メイン アプリの glGetError() からエラーが発生します。

別のテクスチャ フェッチ操作の座標パラメータとしてテクセルを使用することは禁止されているようです。

誰が問題がどこにあるのか教えてもらえますか?

4

2 に答える 2

0

テクスチャ フェッチの結果を別のテクスチャ フェッチの座標として使用することは、依存テクスチャ フェッチと呼ばれ、完全に有効です (ただし、独立したフェスに比べてパフォーマンスに悪影響を与える可能性があります)。

あなたのコードの問題は、おそらく

vec4 back = texture(backFaceTex, (screenPos.xy/screenPos.w+1.0)/2.0);

基本的に許可されていない (vec2(...) + 1.0) 操作があり、コンパイルエラーが発生するはずです。これは、何も描画されず、(有効なプログラムなしで) 描画しようとするとエラーが発生するという事実も説明します。

于 2013-04-28T13:02:23.320 に答える