0

ディレクショナル ライトのシャドウ マップの実装が機能しており、正投影を使用して投影マトリックスを構築しています。私の質問は、シャドウ マップを視覚化するにはどうすればよいですか? スポット ライト (透視投影を使用) に使用する次のシェーダーがありますが、それを正射投影で作成されたシャドウ マップに適用しようとすると、完全に黒い画面になります (シャドウ マッピングは機能しますが)。シーン自体をレンダリングする場合)

#version 430

layout(std140) uniform;

uniform UnifDepth
{
    mat4 mWVPMatrix;
    vec2 mScreenSize;
    float mZNear;
    float mZFar;
} UnifDepthPass;

layout (binding = 5) uniform sampler2D unifDepthTexture;

out vec4 fragColor;

void main()
{
    vec2 texcoord = gl_FragCoord.xy / UnifDepthPass.mScreenSize;

    float depthValue = texture(unifDepthTexture, texcoord).x;
    depthValue = (2.0 * UnifDepthPass.mZNear) / (UnifDepthPass.mZFar + UnifDepthPass.mZNear - depthValue * (UnifDepthPass.mZFar - UnifDepthPass.mZNear));

    fragColor = vec4(depthValue, depthValue, depthValue, 1.0);
}
4

1 に答える 1

1

GL_TEXTURE_COMPARE_MODEに設定して深度テクスチャをサンプリングしようとしていましたGL_COMPARE_R_TO_TEXTURE。これは、実際に深度テクスチャを使用してシャドウ マッピングを実行するのに最適ですが、sampler2Dundefined を使用してサンプリングしようとします。合否テストの結果ではなく、実際の深度値を深度テクスチャに格納する必要があるため、最初に設定GL_TEXTURE_COMPARE_MODEする必要があります。GL_NONE

深度バッファの視覚化と影の描画を切り替える場合に、テクスチャごとにこの状態を設定するのは非常に不便です。シャドウ マッピングを行うシェーダーには(と互換性がある) にGL_TEXTURE_COMPARE_MODE設定されたサンプラー オブジェクトを使用し、深度バッファーを視覚化するために(と互換性がある) を使用する別のサンプラー オブジェクトを使用することをお勧めします。そうすれば、シェーダーが深度テクスチャを実際にどのように使用するかに応じて、テクスチャ イメージ ユニット 5 にバインドされたサンプラー オブジェクトを交換するだけで済みます。GL_COMPARE_R_TO_TEXTUREsampler2DShadowGL_NONEsampler2D

于 2014-01-23T20:58:15.860 に答える