[ZZ] HDR the bungie way
2024-10-11 00:43:16
http://blog.csdn.net/toughbro/article/details/6755394
bungie 06年,gamefest上的paper。
全文讲的比较系统,有空的话还是看原文的比较好,这里摘录一些我觉得很不错的部分。
补上微云链接:http://url.cn/I4SYbF
Why HDR?
为什么要hdr?简而言之就是更加真实,相比之下LDR失真的地方很多,进而影响了沉浸类游戏对玩家的代入感,
具体到实际的好处,列了这么几点:主要集中在范围和细节的保持上
- 让我们进一步感受游戏中的明亮
- 更好的bloom,glare,
- 自动调节曝光,使得根据屏幕亮度情况可以做到最大程度的保持细节
- 在blending的时候保持细节
LinearPipeline
需要在linear space做lighting计算,gamma space的问题就是texture读取和输出都没问题,其实如果不做lighting的话,用srgb读texture,在用srgb写render target结果和不用srgb sample texture,不用srgb write buffer是一样的。
问题就是出在shading上,计算lighting的时候如果在gamma space,数学上就不对,就会不完美。
比如:
linear pipeline
- 硬件gamma correct并不是直接做一个pow计算,而是采用一些近似算法,这里有一定的不匹配的状况,
- 因为在photoshop里和现实的不一致,bungie的artist对此很不爽。
- 这种情况的处理可以在photoshop中使用相应的gamma 的profile,这样就一致了
- alpha blending也是可以有硬件支持来做linear space的
- 不过一直在linear space就好了么
- render target
- 理论上是使用dynamic range(ratio of brightest to darkest)
- 但是实际应用的时候不会这么理想,所以把重点放到usable exposure range比较好
- 也就是不会产生色阶的exposure range
- rgbe和rgbm两种encoding方式没有fp16好,但是也不错,只是没有hardware blending
- halo3的cubemap就是用的rgbm,虽然数学上不全对,但是看起来是不错的
- postfx
- bloom和tone mapping都是有curve来矫正的
- 这里有缺失physically准确性
- 但是也不能拘泥了,本身像电影等也都是在physical正确的前提下去根据人的感觉来做矫正
这里bloom的处理我觉得比较打开思路,之前工作时候遇见有点束手无策(当时是色阶的问题),bungie就会进行深入分析,找出问题的本质,然后巧妙的一个小技巧就搞定了。
这个很像三体里面的那个小水滴状的东西,在大家不了解它的时候,他处于无敌状态,无坚不摧,在大家了解了它之后,摧毁它却又如此简单。
原本的bloom这样的,可以看见bloom有点过了,暗部那里很不好看,希望可以bloom的更清新:
做了bloom curve的结果:
其中是对bloom做了这样的矫正:虚线是原来的bloom分布,后面矫正到黄色线那里。
这里需要注意的就是,curve是针对亮度做的,不能对color的rgb直接做,那样会改变颜色的:
- <span style="font-family:'Microsoft YaHei';">intensity= dot(color, float3(0.3f, 0.3f, 0.3f));
- bloom_intensity = bloom_curve(intensity);
- bloom_color = color * bloom_intensity / intensity;
- </span>
bloom的过程是不停的blur+downsample,然后在up sample回去,得到可以用的bloom buffer。
最新文章
- JAVA代码验证身份证信息
- 分布式监控系统Zabbix-3.0.3-完整安装记录(7)-使用percona监控MySQL
- linux rhel7 dock6.7安装
- 1. IOS 9.3.3描述文件没了处理方法
- [SQL]sql语句中charindex的用法
- Html5——WEB(客户端)数据存储
- android错误 Android NAND: nand_dev_load_disk_state,
- C#.NET连接mysql方法
- 02-OC方法、属性
- tomcat的环境搭建
- csv文件读取
- shell脚本 案例
- lambda 怎么传递ref参数
- ESP8266代码中的存储标记
- Unity外包团队:Daydream控制器只提供了3个自由度
- owin启动事项
- Light Explorer
- 笔记:认识 head 标签 待 更新中……
- e859. 将键盘事件和字符串对应
- JQ和JS获取span标签的内容(有的情况下JQ达不到预期的目的就用JS)
热门文章
- RocketMQ最佳实践
- iptables 开启80端口
- js iframe onload &;line-height浏览器兼容问题
- oracle 10g 学习之客户端安装和配置(2)
- Duilib非官方更新贴~
- C++的那些事:你真的了解引用吗
- CodeForces 222B Cosmic Tables
- WPF/Silverlight HierarchicalDataTemplate 模版的使用(转)
- 系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 &#39;beans&#39; 的声明“异常
- 递推DP URAL 1081 Binary Lexicographic Sequence