2017-06-21 6 views
-2

深度テクスチャからフラグメント位置を再構築して、効率的にライティング計算を実行しています。深さを再構成するときにピクセル位置にジオメトリがない場合の検出

問題は、ジオメトリのない領域(たとえば、下の画像では床、天井、およびウィンドウ)では、照明の計算結果としてフラグメントの出力色が黒色になるという点です。スカイボックスが見えるように、これらの領域を白くする必要があります。

ピクセルフラグメントに元のジオメトリがその場所にない場合、シェーダ内からどのように検出できますか?

enter image description here

void main(void) 
{ 
    // Calculate texture co-ordinate 
    vec2 gScreenSize = vec2(screenWidth, screenHeight); 
    vec2 TexCoord = gl_FragCoord.xy/gScreenSize; 

    // Get the Fragment Z position (from the depth buffer) 
    float z = texture(MyTexture2, vec2(TexCoord.s, TexCoord.t)).x * 2.0f - 1.0f; 
    vec4 clipSpacePosition = vec4(vec2(TexCoord.s, TexCoord.t) * 2.0 - 1.0, z, 1.0); 
    vec4 viewSpacePosition = inverseProjectionMatrix * clipSpacePosition; 

    // Get the Fragment XYZ position (perspective division, via it's depth value) 
    viewSpacePosition /= viewSpacePosition.w; 
    vec4 worldSpacePosition = inverseViewMatrix * viewSpacePosition; 
    vec3 fragPosition = worldSpacePosition.xyz; 

    // Lighting calulations 
    ...... 
} 
+3

... 'glClearDepthf() 'を介して既知の値にデプスバッファをクリア? – genpfault

+0

ジオメトリがない場合、フラグメントはありません。 – merelyMark

+2

@merelyMark私の質問は、個々のパスがフルスクリーンクワッドとしてレンダリングされる遅延シェーディングモデルを意味します。したがって、もともとその場所にジオメトリがない場合でも、すべてのピクセルのフラグメントがあります。 –

答えて

0

この問題に多くのソリューションがあります間違いなく、私はこの1つを思い付きました。

スカイボックスパス:skyboxをアルベドテクスチャにレンダリングし、黒をノーマルテクスチャにレンダリングします。

enter image description here

ジオメトリを渡す:

enter image description here

(アルベドおよび法線)スカイボックス上残りのシーンデータをレンダリング照明パス
:照明を計算し、正常な断片である場合黒、次に白を出力します。

description

コンポジットパス:照明の質感とアルベドテクスチャを掛けます。

enter image description here

関連する問題