下面这个图片应该是比较好的反应了hdr的处理过程的
流程大约如下:
1.首先获得high range的一个floating-point hdr texture
这个过程就是应用普通的光照模型,对于输出的为一个支持浮点数的纹理,不会对RGBA值截断,逼近现实世界的颜色
2.对1得到的texture缩小到1/4 (这个大约是为了节约处理时间,是否可以变得更小呢)的scaled copy,然后根据这个图像计算得到一个average lum texture
3.兼顾The human visual system,计算得到
float fNewAdaptation = fAdaptedLum + (fCurrentLum - fAdaptedLum) * ( 1 - pow( 0.98f, 30 * g_fElapsedTime ) );
4.对scaled copy和average lum合成过滤得到需要高亮的区域 bright pass filter,利用tone mapping
vSample.rgb *= g_fMiddleGray/(fAdaptedLum + 0.001f); // Subtract out dark pixels vSample.rgb -= BRIGHT_PASS_THRESHOLD; // Clamp to 0 vSample = max(vSample, 0.0f); // Map the resulting value into the 0 to 1 range. Higher values for // BRIGHT_PASS_OFFSET will isolate lights from illuminated scene // objects. vSample.rgb /= (BRIGHT_PASS_OFFSET+vSample);
5 对filter后的scaled copy进行bloom 和star处理
6.将bloom star处理后的纹理作用于(tone mapping的处理)正常处理的场景,
补充:
tone mapping :
lumscaled(x,y) = a * lum(x,y) / lumavg(x,y)
color(x,y) = lumscaled(x,y) / ( 1+lumscaled(x,y));