[ZZ] [siggraph10]color enhancement and rendering in film and game productio

原文link:<color enhancement and rendering in film and game production>

是siggraph 2010,“Color Enhancement and Rendering in Film and Game Production” course的一个paper。

从摄影到电影里面使用的技术,来启发游戏里怎么使用。

很不错的一个地方是:了解到了filmic tone mapping是怎么来的了,之前uncharted2的文章还看的我一头雾水

http://blog.csdn.net/toughbro/article/details/6755980

首先是一个dynamic range的map,这个图不错:显示了从现实世界,到camera,到display的一个mapping关系,具体情况中会根据需要来做一些range上的取舍,也就是进一步的mapping。

这里面我们要逐渐习惯的以方式就是curve的表达方法,比如增加contrast,我们可能直接那一个公式搞起,这里就用curve来表示:

这里是推导filmic tonemapping curve的一个过程:可以看下图

  1. 直接把camera得到的range,map到display的range,画面会很灰:series2
  2. 那么加一些对比度,但又会遇到严重的clamp问题:series3
  3. 所以加一些柔和,把clamp那里做柔,变成这样:series1

后面还有好多的color grading相关的内容,但是只有图没文字,所以也没法记了。

float游戏存储照片blogimage

HDR

high dynamic range.

很多程序朋友(包括我)都是从dxsdk上看到和学习这个概念,开始学习的更多的是一整套hdr sample的流程:

  • 在float render target上去render scene
    • 后面很多console上的游戏使用rgbm等编码方式来节省内存和bandwidth
  • 通过down sample去计算亮度
    • treyarch是cook到场景数据里面,省了这个down sample的过程
  • 根据亮度对场景做一个矫正(tone mapping)最后输出到一个rgb8的render target上

但是随着游戏业的画面水准开始向电影水准发展,就需要我们有更好的理解HDR,来进一步把游戏像电影画质推进,这也是近几年的GDC和siggraph上都有一线studio在推HDR相关的技术,比如naughty dog10年的filmic tone mapping,11年crytek在siggraph里面提到的physically based hdr等。

首先看一下概念:

  • dynamic range:reinhard的<tone mapping>论文中定义:一个场景中最高亮度与最低亮度的比是dynamic range。
  • low dynamic range : 之所以出现这种情况是图像存储介质(打印纸,照片,电脑屏幕等)精度有限造成的,导致在range上没法完全记录一个场景的亮度信息,只能记录有限的一部分,比如游戏里常见的在rgba8上渲染,每个channel大于1的部分就被截取到1了。
  • high dynamic range : 准确讲是high dynamic range imaging,是指一种图像技术,它能让图像表示一个比原有技术(之前的LowDynamicRange)更大(greater)的dynamic range
    • 这样就可以更加准确和真实的描绘一个场景

进一步说,hdr的存在在于图像存储与表达介质的精度有限,这也是为何游戏引擎大佬在提的都是CG和电影画质,而不是和现实一样的:因为存储介质在这里摆着呢,没法和现实一样,cg是上限。

实际应用中,我们也看到了,hdr除了在range上发力,在精度上也可以更好,比如描绘发暗的场景,可以把亮度矫正到可以充分显示暗部细节。

ToneMapping&ExposureAdjustment

这里除了数学上正确的亮度计算以外,要考虑到人眼视网膜的特点,比如之前的gamma就是一个根据视网膜特点,重新分配亮度信息,来让人眼在有限的显示精度下获得最大的信息量。视网膜有两个典型特点,这里通过tone mapping和exposure adjustment来解决:

  • 自动根据亮度矫正明暗:让我们晚上看东西也能比较清楚,一开灯眼睛要矫正一会回来
  • 局部适应性:比较经典的图是:

这里我们遇到两个问题,各用两个方案解决:

  • 曝光率问题---解决:exposure adjustment。和照相时候曝光原理差不多,白天亮曝光就短一些,晚上曝光长一些,编程时候就是计算render target的平均亮度,然后矫正,这样沙漠的白天和丛林的夜晚都可以在游戏中的rgba8上有一个良好的体现。在hable的论文里,这个属于不同的场景之间的处理问题范畴。
  • 压缩的过程中不可避免的涉及到重新分配亮度值,怎么做来得到更好的尽可能不失真的画面这个解决方案就是tone mapping

实际中也有把这个exposure adjustment并到tone mapping中去,其实还是分开比较好,因为这些概念是从摄像技术中来的,曝光就是曝光,tone mapping就是tone mapping。

ReinhardToneMapping

tone mapping方面比较著名的reinhard哥:

reinhard主页

http://www.cs.ucf.edu/~reinhard/cdrom/

paper link:

http://www.cs.ucf.edu/~reinhard/cdrom/tonemap.pdf

tone mapping干什么的?

dxsdk里面也有说,本来是摄影中提出的概念,解决怎么把场景中范围巨大的亮度值放到范围有限的存储空间中来(照片,打印机。。。),达到一个让人喜欢的结果。

这里面一点是“让人喜欢的结果”,它是一个含有主观意味的东西,没有一个绝对的标准,也没有说什么是绝对的对和错,根据游戏类型和开发者,玩家口味,大可选择自己喜欢的结果,tonemapping是达到这一结果的方法而已。

tonemapping相关的研究是从摄影技术中发展过来的,只不过digital imaging有比摄影洗相片更好的一个优势,可以进一步发展:

首先明确和定义一些概念:

  • zone:存储空间的亮度阶这么一个概念,比如print只有11个zone
  • middle grey:中间的亮度
  • dynamic range:指场景中最高亮度与最低亮度的比值
    • 这是一个最学术派的定义,具体上摄像师一般会追求细节还可以明辨的range
  • key:描述整个场景亮度的数值
  • dodging and burning:把高亮度的东西亮度降低为dodging,把低亮度的部分加亮为burning

luminance mapping

首先是把场景亮度map到image里,这一步是luminance mapping:

luminance计算:

这个计算使用了log。

step 1: simplest

result = x/(1+x); 最简单的一个情况,就把任意大的亮度encode到0到1之间。

虽然效果不那么好,但这也算一个luminance mapping。

step2:more control

L(white)定义的是在画面上表示纯白的亮度。

dodging and burning

一般来讲像dxsdk里面做的都是全屏统一的一个量度矫正,这个也是可以的,但是reinhard这里面说有时候这样并不太好,比如整个场景很亮,里面一部分很暗的情况(比如亮背景下的一个树),全屏统一做矫正(也就是dodging and burning),效果就不好。

这时可能在一个较小的区域来进行dodging and burning可以进一步提升local的对比度,可以达到某些情况下的“令人喜欢”。

这里的基本思路就是在一个scale内去搜集亮度等信息,来做进一步计算,operator也很多。

基本上知道这里已经够了。

FilmicToneMapping

gdc10上当时在naughty dog工作的hable的presentation:

http://cmpmedia.vo.llnwd.net/o1/vault/gdc10/slides/Hable_John_Uncharted2_HDRLighting.pptx

后来他又在自己blog上说了更多的细节:(甚至说更重要,ppt上的内容但看的话会有很多不解的地方)

http://filmicgames.com/archives/75

tone mapping就是一个原始颜色向目标颜色映射的过程,不同的函数呈现一些不同的特点,这里列一些,看下对比:

ppt中有更多的一些对比,这里直接总结filmic tone mapping的好处就是:

  • 向暗色过渡的更“脆”
  • 高亮部分更柔和
  • 在input color的match上也更接近linear

最后简单讲,hable把cg工业中的这个operator拿过来用就是因为在实际应用中这个看起来更棒。

这个也是很多电影在用的operator,它的mapping曲线这样的:

实现类似filmic tone mapping的mapping的时候一般是把映射关系放到texture里,然后sample texture,不过有牛人把mapping搞到一个公式里了,hable还加了参数可以让美术调:

[cpp] view plaincopyprint?

  1. A = Shoulder Strength
  2. B = Linear Strength
  3. C = Linear Angle
  4. D = Toe Strength
  5. E = Toe Numerator
  6. F = Toe Denominator
  7. Note: E/F = Toe Angle
  8. LinearWhite = Linear White Point Value
  9. F(x) = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F)) - E/F;
  10. FinalColor = F(LinearColor)/F(LinearWhite)‏

在具体的代码看hable的blog更好了:

[cpp] view plaincopyprint?

  1. float A = 0.15;
  2. float B = 0.50;
  3. float C = 0.10;
  4. float D = 0.20;
  5. float E = 0.02;
  6. float F = 0.30;
  7. float W = 11.2;
  8. float3 Uncharted2Tonemap(float3 x)
  9. {
  10. return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;
  11. }
  12. float4 ps_main( float2 texCoord  : TEXCOORD0 ) : COLOR
  13. {
  14. float3 texColor = tex2D(Texture0, texCoord );
  15. texColor *= 16;  // Hardcoded Exposure Adjustment
  16. float ExposureBias = 2.0f;
  17. float3 curr = Uncharted2Tonemap(ExposureBias*texColor);
  18. float3 whiteScale = 1.0f/Uncharted2Tonemap(W);
  19. float3 color = curr*whiteScale;
  20. float3 retColor = pow(color,1/2.2);
  21. return float4(retColor,1);
  22. }
时间: 2024-10-24 16:25:11

[ZZ] [siggraph10]color enhancement and rendering in film and game productio的相关文章

webrtc教程

cdsn博客不支持word文件,所以这里显示不完全.可到本人资源中下载word文档: v0.3:http://download.csdn.net/detail/kl222/6961491 v0.1:http://download.csdn.net/detail/kl222/6677635  下载完后评论,可以返还你的积分.此文档还在完善中,欢迎大家交流,共同完善.    Webrtc  教程 版本0.3(2014年2月) 康林 ([email protected]) 本文博客地址:http://

WebRTC音视频引擎研究(1)--整体架构分析

WebRTC技术交流群:234795279 原文地址:http://blog.csdn.net/temotemo/article/details/7530504 1.WebRTC目的 WebRTC(Web Real-Time Communication)项目的最终目的主要是让Web开发者能够基于浏览器(Chrome\FireFox\...)轻易快捷开发出丰富的实时多媒体应用,而无需下载安装任何插件,Web开发者也无需关注多媒体的数字信号处理过程,只需编写简单的Javascript程序即可实现,W

【IOS笔记】Views

Views Because view objects are the main way your application interacts with the user, they have many responsibilities. Here are just a few: 通过view对象是与用户交互的主要方式,它们有很多责任,下面是其中一些: Layout and subview management   布局 A view defines its own default resizin

ISP模块之彩色图像增强--ACE算法 .

ACE(Automatic Color Enhancement),自动色彩增强算法,是一种对于彩色图像增强十分行之有效的方法.它的改进算法以及快速实现在文章Automatic Color Enhancement (ACE) and its Fast Implementation,2012中提出. 在NxN的图像上,ACE算法的算法复杂度为O(N^4),文章提出的新的ACE算法采取了两种近似的方法,一是采用多项式函数逼近坡度函数(Slope function)降低卷积计算量,二是采用不同程度的插值

对pathtracing的一些个人理解

本人水平有限,若有错误也请指正~ 上面说到pathtracing(pt)的一些优点和缺点,优点即其实现很简单,这就是大概为什么当今市面上流行的很多渲染器如今都相继采用pathtracing算法为核心进行实现,但是pathtracing的最大缺点就是收敛速度很慢,其原因就在于全局光照的那个积分式要求在半球面上连续采样,这就需要每次发射n条采样光线,n的数量直接决定了最终图像的质量(对于pt来讲它的图像质量取决于噪点数量的多少,噪点多的话有点像用老式胶片拍出来的照片那样),一般n越大图像过渡越光滑.

ISP模块之色彩增强算法--HSV空间Saturation通道调整 .

色彩增强不同于彩色图像增强,图像增强的一般处理方式为直方图均衡化等,目的是为了增强图像局部以及整体对比度.而色彩增强的目的是为了使的原有的不饱和的色彩信息变得饱和.丰富起来.对应于Photoshop里面的“色相/饱和度”调节选项里面对饱和度的操作.色彩增强的过程,并不改变原有彩色图像的颜色以及亮度信息. 在我的色彩增强算法模块里面,始终只针对色彩饱和度(Saturation)信息做研究,调整.这样的话,那就不得不介绍HSV颜色空间了,H代表Hue(色彩),S代表Saturation(饱和度),V

WebRTC代码走读(八):代码文件夹结构

转载注明出处http://blog.csdn.net/wanghorse ├── ./base //基础平台库,包含线程.锁.socket等 ├── ./build //编译脚本.gyp ├── ./common_audio //基础公共的音频处理 │ ├── ./common_audio/include //就一个类型转换头文件 │ ├── ./common_audio/resampler //音频重採样代码 │ ├── ./common_audio/signal_processing //音

WebRTCDemo.apk代码走读(八):代码目录结构

转载注明出处http://blog.csdn.net/wanghorse ├── ./base //基础平台库,包括线程.锁.socket等 ├── ./build //编译脚本,gyp ├── ./common_audio //基础公共的音频处理 │ ├── ./common_audio/include //就一个类型转换头文件 │ ├── ./common_audio/resampler //音频重采样代码 │ ├── ./common_audio/signal_processing //音

[ZZ] Deferred Rendering and HDR

http://www.gamedev.net/topic/496785-deferred-rendering-and-hdr/ Quote: Original post by jstrohYeah I've been reading about people saying "oh you can only do it if the device supports fp16 texture blending" but it's pretty simple to just add to a