-2
深度テクスチャからフラグメント位置を再構築して、効率的にライティング計算を実行しています。深さを再構成するときにピクセル位置にジオメトリがない場合の検出
問題は、ジオメトリのない領域(たとえば、下の画像では床、天井、およびウィンドウ)では、照明の計算結果としてフラグメントの出力色が黒色になるという点です。スカイボックスが見えるように、これらの領域を白くする必要があります。
ピクセルフラグメントに元のジオメトリがその場所にない場合、シェーダ内からどのように検出できますか?
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
......
}
... 'glClearDepthf() 'を介して既知の値にデプスバッファをクリア? – genpfault
ジオメトリがない場合、フラグメントはありません。 – merelyMark
@merelyMark私の質問は、個々のパスがフルスクリーンクワッドとしてレンダリングされる遅延シェーディングモデルを意味します。したがって、もともとその場所にジオメトリがない場合でも、すべてのピクセルのフラグメントがあります。 –