`

HDR&ToneMapping

 
阅读更多

from: http://blog.csdn.net/ccanan/article/details/6745207

 

HDR&ToneMapping



 

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上的内容但看的话会有很多不解的地方)
 

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



 

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

  • 向暗色过渡的更“脆”
  • 高亮部分更柔和
  • 在input color的match上也更接近linear
最后简单讲,hable把cg工业中的这个operator拿过来用就是因为在实际应用中这个看起来更棒。
这个也是很多电影在用的operator,它的mapping曲线这样的:


 实现类似filmic tone mapping的mapping的时候一般是把映射关系放到texture里,然后sample texture,不过有牛人把mapping搞到一个公式里了,hable还加了参数可以让美术调:
A = Shoulder Strength
B = Linear Strength
C = Linear Angle
D = Toe Strength
E = Toe Numerator
F = Toe Denominator
Note: E/F = Toe Angle
LinearWhite = Linear White Point Value
F(x) = ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F)) - E/F;
FinalColor = F(LinearColor)/F(LinearWhite)‏
 在具体的代码看hable的blog更好了:
float A = 0.15;
float B = 0.50;
float C = 0.10;
float D = 0.20;
float E = 0.02;
float F = 0.30;
float W = 11.2;

float3 Uncharted2Tonemap(float3 x)
{
   return ((x*(A*x+C*B)+D*E)/(x*(A*x+B)+D*F))-E/F;
}

float4 ps_main( float2 texCoord  : TEXCOORD0 ) : COLOR
{
   float3 texColor = tex2D(Texture0, texCoord );
   texColor *= 16;  // Hardcoded Exposure Adjustment

   float ExposureBias = 2.0f;
   float3 curr = Uncharted2Tonemap(ExposureBias*texColor);

   float3 whiteScale = 1.0f/Uncharted2Tonemap(W);
   float3 color = curr*whiteScale;

   float3 retColor = pow(color,1/2.2);
   return float4(retColor,1);
}
 

 



 
 
  • 大小: 131.1 KB
  • 大小: 25.6 KB
  • 大小: 25.2 KB
  • 大小: 17.4 KB
  • 大小: 8.7 KB
  • 大小: 32.2 KB
  • 大小: 69.5 KB
分享到:
评论

相关推荐

    HDR, tone mapping代码

    2. ToneMapping:这是一个目录,很可能包含了实现特定tone mapping算法的源代码或者应用程序。可能包括不同的算法,如Reinhard tone mapping、Durand tone mapping、Fattal tone mapping等,这些算法都有各自的优...

    2.HDR和ToneMapping技术1

    在计算机图形学与摄影领域中,HDR技术及其相关算法Tone Mapping扮演着至关重要的角色。HDR,意为高动态范围渲染,其目的在于捕捉和呈现现实世界中极端亮度的细节,比如从深夜的黑暗到阳光下的闪耀。传统显示器的亮度...

    图形学实验 tonemapping

    在计算机图形学领域,"tonemapping"是一个关键的概念,用于处理高动态范围(HDR)图像,使其适应人类视觉系统对亮度的感知,并适合在低动态范围(LDR)显示设备上展示。在这个实验中,我们将深入理解并实践tone...

    open gl 在MFC下实现tone mapping算法

    Tone Mapping是一种用于高动态范围(HDR)图像到低动态范围(LDR)图像转换的技术,使得图像在有限的显示范围内能够展现更丰富的明暗细节。 首先,我们需要理解OpenGL的基础。OpenGL是一个跨语言、跨平台的编程接口...

    L1L0_TM-CVPR2018-master_layerdecomposition_l1l0_tonemapping_

    标题"L1L0_TM-CVPR2018-master_layerdecomposition_l1l0_tonemapping_"提及的是一项在图像处理领域的技术,主要涉及图像的分层分解、L0和L1范数的应用以及色调映射(Tone Mapping)。这项技术在CVPR 2018(计算机...

    Real-Time_Tone_Mapping_for_High-Resolution_HDR_Images.pdf

    ### 实时色调映射在高分辨率HDR图像中的应用 #### 概述 本文探讨了针对高分辨率HDR(High Dynamic Range)图像的实时色调映射技术。色调映射是一种将HDR图像转换为适合LDR(Low Dynamic Range)显示设备观看的过程...

    色调映射(tone mapping)

    色调映射(tone mapping)是一种在图像处理和视频捕捉领域中非常重要的技术,它可以用来优化图像的色彩和细节表现。色调映射允许图像在不同光照条件下的对比度和亮度得以增强,同时保持或提高图像的质量。在本书...

    Tone mapping

    Tone Mapping(色调映射)是一种用于将高动态范围(High Dynamic Range, HDR)图像转换为适合显示设备(如显示器或打印机)低动态范围(Low Dynamic Range, LDR)的技术。这项技术在摄影、计算机图形学以及数字图像...

    Adaptive Local Tone Mapping Based on Retinex .pdf

    本文介绍了一种基于Retinex理论的自适应局部色调映射技术,主要针对高动态范围(HDR)图像的低照度图像恢复。Retinex理论是建立在人眼视觉系统能够适应广泛光照范围的基础上,它通过模拟人眼对光线强度的适应机制,...

    Optimization of video capturing and tone mapping in video camera systems.pdf

    为了实现上述优化,需要采用先进的算法,如色调映射曲线(tone mapping curves),保持色调信息的同时,对亮度进行适当的压缩。另外,算法可能还需考虑到图像的视觉效果,以及图像细节在不同亮度条件下的可感知性。 ...

    Filmic Tonemapping DELUXE v2.0.3.rar

    在Unity开发中,色调映射(Tonemapping)是一个至关重要的环节,它处理原始高动态范围(HDR)的图像数据,将其转换为适合于标准显示器的低动态范围(LDR)显示。这个过程涉及到色彩校正、对比度调整以及亮度优化等多...

    CUDA-HDR-Tone-mapping:CUDA源文件,用于处理图像的亮度通道并应用HDR色调映射

    CUDA-HDR-Tone-mapping项目是一个利用CUDA技术进行高动态范围(HDR)图像处理的开源实现,主要关注亮度通道的调整和HDR色调映射。CUDA是NVIDIA公司开发的一种编程模型,它允许开发者利用GPU的强大并行计算能力来加速...

    High dynamic range imaging and tonemapping

    该开源代码在实现“Photographic Tone Reproduction for Digital Images”论文算法时有一处错误。论文本身有一个符号错误和一个参数设置不合理。这些我都在程序中做了修正。关于该论文的色调映射算法讲解可参见我的...

    S2H_imageprocessing_tonemapping_

    标题"S2H_imageprocessing_tonemapping_"暗示了这是一个关于图像处理和色调映射(Tone Mapping)的主题。在数字图像处理领域,色调映射是一种用于调整图像亮度和对比度的技术,尤其是在高动态范围(HDR)图像转换为低...

    ly6766_tonemapping.pdf

    在讨论的内容中,涉及了色调映射(tonemapping)的概念和应用,特别是与高动态范围(HDR)图像处理相关的技术。色调映射是一种图像处理技术,用于将HDR图像(这种图像能表现超出普通图像显示范围的亮度)调整到较低...

    c++rgb-hdr.cpp_hdr_HDR算法_datew3n_

    综上所述,"c++rgb-hdr.cpp_hdr_HDR算法_datew3n_"项目专注于使用C++实现HDR图像处理的关键步骤,包括多帧曝光合成、图像校正、Radiance Map创建、tone mapping以及最终的图像融合。这个过程涉及到对图像处理理论的...

    CONTENT-ADAPTIVE INVERSE TONE MAPPING

    ### 内容自适应逆色调映射(Content-Adaptive Inverse Tone Mapping) #### 摘要 逆色调映射作为一种关键技术,在将低动态范围(LDR)内容转化为具有高动态范围(HDR)效果显示方面扮演着重要角色。现有的逆色调映射算法...

    toneMapping.m

    程序是对Reinhard论文“Photographic Tone Reproduction for Digital Images”的实现,具体的讲解可参考我的博客https://blog.csdn.net/u014230360/article/details/108527016

    ToneMapping图像色调映射.rar

    在程序中提出了一种利用亮度直方图构造色调映射查找表(LUT)的色调映射算法。融合人类视觉系统(HVS)的特性,在构造直方图的同时,更加重视视觉可分辨度...使用memorial.hdr图像例子,图像高动态映射后细节表现完美。

    High Dynamic Range Imaging 2nd Edition 参考HDR MATLAB工具箱及demo

    在MATLAB工具箱中,HDR合成通常涉及图像对齐、曝光融合和tone mapping等步骤。通过对LDR图像的处理,可以得到保留更多亮度信息的HDR图像,从而实现更真实、更丰富的视觉效果。 5. ** Tone Mapping**: Tone ...

Global site tag (gtag.js) - Google Analytics