`

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

    Tone Mapping是HDR技术的核心组成部分,它是一种将高动态范围的图像转换为适合标准显示设备的低动态范围(LDR)图像的过程。这个过程涉及到对图像亮度的重新映射,使得原本超出显示器能力范围的亮度信息得以适配显示...

    图形学实验 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