UE4画面亮度可视化
Posted xoyojank
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE4画面亮度可视化相关的知识,希望对你有一定的参考价值。
参考https://www.artstation.com/artwork/3omYwB做一个这样的视图, 用于Debug光照亮度:
需要获取当前像素的亮度(nit), 映射成一个颜色显示出来
获取当前像素亮度
正好在EyeAdaption Debug视图有一个nit显示:
翻代码发现NIT/LUX值是在Shader中实现的(骚操作):
向上查找Luminance来源自HDRSceneColorSampler:
而HDRSceneColorTexture就是Toonmap前的SceneColor:
那么Luminance = max(SceneColorBeforeTonemap.r, max(SceneColorBeforeTonemap.g, SceneColorBeforeTonemap.b)
颜色亮度转换成颜色显示
可以使用Post Process Material来获取SceneColor, 如果是SceneColorBeforeTonemap, 那就把Post Process Material的Phase改成Before Toonmapping
简单地实现一下材质亮度转换成颜色进行输出:
可以看到颜色并不是我们想要的映射关系, 参考资料并不是一个线性的映射关系
亮度到颜色的查表映射
如果想在材质中进行颜色查表, 最方便的是做个ColorCurve:
包装成CurveAtlas纹理:
然后就可以在Material中进行采样查表了:
不过发现颜色显示会受自动曝光影响, 所以Material需要再改一下生效的阶段:
最终效果
PS: UE4中的LinearColor To Luminance我找到了三种算法:
- EyeAdaption Shader里是dot(OutColor.xyz, float3(1.0f, 1.0f, 1.0f)/3.0f), 也就是(r + g + b) / 3
- PostProcessVisualizeHDR里是max(LuminanceAvg.r, max(LuminanceAvg.g, LuminanceAvg.b)), 即max(r, g, b)
- Bloom里Luminance又是用的dot( LinearColor, MaterialFloat3( 0.3, 0.59, 0.11 ) )
以上是关于UE4画面亮度可视化的主要内容,如果未能解决你的问题,请参考以下文章
[UE4]瞬移前后屏幕亮度变化,Get Player Camera Manager.Start Camera Fade