我正在尝试实现色调映射以及眼睛适应和HDR。其实我已经实现了,但是对结果不满意,我认为我做错了。
我的最终图像(在后处理之前)以半浮点纹理存储。我也有2个辅助纹理。第一个将对数亮度及其平均,最小和最大颜色存储在最后一个mip映射中。第二个存储适应值,其计算公式为:
prevLum + (avgLum - prevLum) * (1.0 - exp2(-adaptionRate))
其中prevLum是先前的适应值(此纹理的大小为1x1)。对数亮度纹理是R8B8G8格式,第二个是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
首先,您应该尝试禁用绽放,并且仅在绝对必要的条件下使用。同样,如果色调映射使您的白色变暗,则可能意味着它不在0-1范围内映射,您应该更改此设置或相应地调整照明。
—
akaltar
做得好,您是否有指向项目的链接?
—
danijar
谢谢。目前我没有任何链接。但是,当我完成硕士论文时,我将在YouTube或.exe文件上发布一些视频。
—
哈里