私は目の順応とHDRとともにトーンマッピングを実装しようとしています。実際に実装しましたが、結果に満足できず、何か間違ったことをしたと思います。
私の最終的な画像(後処理前)は、フロートテクスチャの半分に保存しています。2つのヘルパーテクスチャもあります。最初のログは、最後のミップマップにログの輝度とその平均、最小、最大の色を保存します。2つ目は、次のように計算される適応値を格納します。
prevLum + (avgLum - prevLum) * (1.0 - exp2(-adaptionRate))
ここで、prevLumは以前の適応値です(このテクスチャのサイズは1x1です)。対数輝度テクスチャはR8B8G8形式で、2番目はR8です。チュートリアルでは、フロートテクスチャの半分が使用されていることを確認しましたが、私の場合、画像が明るすぎます(ほぼ白)。
最後のポストプロセスシェーダーでは、このコードを使用してアイアダプテーションとトーンマッピングを取得するためにすべての値を使用しています。
float autokey(in float lum) {
return 1.03 - 2.0 / (2.0 + log10(lum + 1.0));
}
float hejl(in float color) {
float x = max(0.0, color - 0.004);
return (x * (A * x + B)) / (x * (A * x + C) + D);
}
float adaptedLum = texture(adaptedLuminance, vec2(0.5)).r;
float exp = exposure * autokey(adaptedLum) / adaptedLum;
result *= exp;
result.xyz=RGB2xyY(result.xyz); // conversion to CIE xyY
result.z = hejl(result.z);
result.xyz=xyY2RGB(result.xyz);
そして、これが私の結果です:
- 目の順応とトーンマッピングがオン
- 目の順応のみ
- トーンマッピングのみ
- すべてオフ
トーンマッピングをオンにすると、バニーの色が薄くなります。また、目の順応をオンにすると、最終的な画像ははるかに暗くなります。私はここで何かが間違っていると思うので、誰かが私にそれを引き起こす原因を説明してもらえますか?色空間がよくわからないのかな?または、トーンマッピングと目の順応の前に適用されるブルームとは?
私はまた、目の順応に関して奇妙な行動をしています。暗いところを見ると背景(空)が明るくなります。大丈夫ですが、カメラの中心が黒い領域にある場合は常に発生します(カメラがこの領域からどれだけ離れていても)。
このページのプロジェクトに含まれる実装に基づいています: John Chapman、 Nutty Software