博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[ZZ] HDR the bungie way
阅读量:5929 次
发布时间:2019-06-19

本文共 1664 字,大约阅读时间需要 5 分钟。

 

bungie 06年,gamefest上的paper。

全文讲的比较系统,有空的话还是看原文的比较好,这里摘录一些我觉得很不错的部分。

补上微云链接:

                                                                                                                                                                                                                                       

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直接做,那样会改变颜色的:
[cpp] 
  1. <span style="font-family:'Microsoft YaHei';">intensity= dot(color, float3(0.3f, 0.3f, 0.3f));  
  2. bloom_intensity = bloom_curve(intensity);  
  3. bloom_color = color * bloom_intensity / intensity;  
  4. </span>  
bloom的过程是不停的blur+downsample,然后在up sample回去,得到可以用的bloom buffer。

转载于:https://www.cnblogs.com/kylegui/p/3871174.html

你可能感兴趣的文章
JS数据类型分类和判断
查看>>
两位数据科学家跟你聊聊AI那点事儿(附学习资料)
查看>>
[译] 为什么 HTML 中复选框样式难写 — 本文给你答案
查看>>
环境配置01-win10+Cenos双系统安装过程记录
查看>>
请教nodejs中promise、setTimeout、setImmediate在eventloop中的执行时机问题
查看>>
从零开始,如何打造出一个好的运营团队
查看>>
python学习干货教程(2):环境变量配置
查看>>
LeetCode每日一题: 种花问题(No.605)
查看>>
【综述】各类人工智能&大数据相关比赛
查看>>
JavaScript对象浅析
查看>>
TEST
查看>>
微信分享音乐给好友时会话列表无法快捷播放问题填坑记录
查看>>
一些jQuery小知识点(笔记)
查看>>
前端工程化篇之 gulp 一文让您轻松掌握gulp 【全套gulp源码注释解析】
查看>>
移动端 IOS的两个小坑
查看>>
[译] 职业成长的内部指南
查看>>
Git无法使用
查看>>
sql更新是如何执行的?
查看>>
图片上传及图片处理
查看>>
Nacos: Namespace 和 Endpoint 在生产环境下的最佳实践
查看>>