全方向性ポイントライトを使用しています。キューブマップテクスチャを6つのフレームバッファのカラーアタッチメントとして使用し、その各ピクセルの光からフラグメントまでの距離をエンコードするシャドウマッピングをすでに実装しました。
可能であれば、実装を次のように変更したいと思います。
- 1)色ではなく、デプスキューブマップテクスチャをフレームバッファのデプスバッファにアタッチします。
- 2)深さのみをレンダリングし、このパスには色を書き込まないでください
- 3)メインパスで、キューブマップテクスチャから深度を読み取り、それを距離に変換して、現在のフラグメントがライトによって遮られているかどうかを確認します。
私の問題は、キューブマップからの深度値を距離に戻すときに発生します。光からフラグメントへのベクトル(世界空間)を使用して、キューブマップの深度値を取得します。この時点では、6つの面のどれが使用されているのか、またどの2Dテクスチャ座標が私が読んでいる深度値と一致するのかわかりません。次に、その深度値を距離に変換するにはどうすればよいですか?
これが私のコードの抜粋です。
深さのテクスチャ:
glGenTextures(1, &TextureHandle);
glBindTexture(GL_TEXTURE_CUBE_MAP, TextureHandle);
for (int i = 0; i < 6; ++i)
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_DEPTH_COMPONENT,
Width, Height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
フレームバッファの構築:
for (int i = 0; i < 6; ++i)
{
glGenFramebuffers(1, &FBO->FrameBufferID);
glBindFramebuffer(GL_FRAMEBUFFER, FBO->FrameBufferID);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, TextureHandle, 0);
glDrawBuffer(GL_NONE);
}
コードを実現するために作成しようとしているフラグメントシェーダーの一部:
float ComputeShadowFactor(samplerCubeShadow ShadowCubeMap, vec3 VertToLightWS)
{
float ShadowVec = texture(ShadowCubeMap, vec4(VertToLightWS, 1.0));
ShadowVec = DepthValueToDistance(ShadowVec);
if (ShadowVec * ShadowVec > dot(VertToLightWS, VertToLightWS))
return 1.0;
return 0.0;
}
DepthValueToDistance関数が私の実際の問題です。