请选择 进入手机版 | 继续访问电脑版

开源计算机图形学社区(Open Source Computer Graphics Community) |OpenGPU Forum (2007-2013)| OpenGPU Project

 找回密码
 注册
搜索
查看: 2150|回复: 19

什么是游戏里的HDR?(完整解释 科普向) [复制链接]

Rank: 9Rank: 9Rank: 9

注册时间
2016-5-6
积分
239
发表于 2017-2-28 17:50:18 |显示全部楼层
本帖最后由 升级君 于 2017-2-28 17:53 编辑

HDR 英文全称 High Dynamic Range Imaging 中文名 高动态范围成像,这种技术可以表现 更宽泛的明暗范围(
亮度值远超过 0-255这个有限的整数区间)

普通显示器一般属于LDR(低动态范围成像),我们平时用的液晶显示器的亮度范围通常是0-255,
而对应普通图形渲染程序中的 后台颜色缓存格式 通常是 A8R8G8B8,因为每个颜色分量值只有八位,所以亮度范围不可能超过255.

那HDR对于游戏中的真正存在意义是什么?
普通显示器只能表示0-255的亮度范围,游戏里所有超过1.0的像素统统被裁减成1.0,所以这里就有个很严重的
问题,比如 在游戏里的某个场景有两个区域,一块区域是大白天的室外,另一块区域是昏暗的室内,而玩家会
经常在这两个区域里无缝切换,所以问题就来了,
大家平时自己也会察觉到一种现象,在白天当你在屋内的时候,会感觉窗外的东西都显得特别亮,而屋内亮度
却感到适中,但当你走出屋外,看屋内的时候,你又会发现屋外又不显得那么亮了,但对面的屋内的物体却变暗了。

这就是一种人眼瞳孔对周围光线射入量进行的一种自适应调节,当你在屋外的时候,射入到人眼中的光线会更
多,所以瞳孔适当的缩小,减少光线的摄入,这个时候你会感觉屋外不那么亮了。当你在屋内的时候,由于周
围的光线量减少,所以你的瞳孔会增大,这样就可以吸收更多的光线,这个时候你会觉得屋内也不那么暗了。

同理在游戏里也是一样,当玩家在昏暗的区域和明亮的区域来回切换时,也需要有这样一种变化,比如游戏场
景里从某个房间的窗外景色都是一片泛白,而当玩家走出房间,突然泛白的室外又渐渐的变暗并清晰了下来。

从程序中来讲,其实当玩家在屋内的时候,窗外所有的模型包括天空盒等这些对应像素的亮度大部分都超过了
1.0f,而室内这个时候模型的像素亮度大部分都在0-1.0之间(整数范围是0-255区间)。
现实中的太阳光照射下物体的亮度肯定远不止0-255这个整数范围,所以真正要表现实际的现实中的亮度范围,

就需要让室外模型对应的像素亮度提升至 255以外(浮点就是远远大于1.0f这个上限)。
但遗憾的时候,普通的显示器,能绘制的最高亮度上限是1.0, 任何超过1.0的像素都会被直接裁剪成1.0,而
为1.0的像素亮度统一绘制成白色。

所以在制作场景的时候,一个美工不可能把一个模型的材质亮度调到1.0以上,但在实际的游戏中,恰恰需要在
某些地方让模型的亮度远远大于1.0,但又能在昏暗的室内环境里,模型的亮度又能自动缩回到1.0以内,
所以游戏里才需要某种技术 可以表现出这个现实中具有的高亮度围的效果,

那这个技术是什么,高动态范围光(HDR),而HDR的实现在照相和游戏两个领域中是有一定差别的,
我这里只说游戏中的HDR实现
其实游戏里并不是要去真正的表现 高动态范围成像,因为游戏是实时渲染,考虑到性能成本,所以只能去模拟

HDR的这种特性。
通常在美工制作场景的环节,每个模型的材质亮度属性都是预先设置后,在游戏中实时进行中是不会动态变化的。

所以没有HDR的情况下,当玩家在屋内环境中,屋外的物体的像素亮度依然是1.0以内,所以本事阳光高照的场
景,屋外看起来依然很暗,而走出屋外的时候,屋外屋内的亮度都没有任何变化,并且屋内却依然很亮,这就明显的不真实。
所以游戏中要用HDR技术来实现明暗的动态变化,其中一个关键步骤就是 色调映射(Tonemapping)
,通常先计算出当前玩家所在区域像素的平均亮度,然后根据这个平均亮度对整个场景模型的像素亮度做动态调整,比如玩家在室内的环境里,整体亮度肯定偏暗(因为太阳直接光照少,间接光照多),所以计算出来的平均亮度就比较低,然后再根据tonemapping公式把整体亮度动态上调,让暗的物体也变的亮起来,室外同理,这是不是和之前说的 人眼瞳孔为了适应周围额环境,进行放大缩小动态调节光线摄入量的原理很相似?恩是一样的。

Tonemapp的数学公式通常为: l=Y/(Y+1),这个函数将场景在 (0-N) 范围的值 Y 映射到显示输出范围 (0-1)内的l
附代码如下:
final_color *= MIDDLE_GREY / lum;
final_color = src_color / (1.0f + src_color);
这里lum为当前帧中计算的全屏平均亮度,src_color为tonemapping之前的源像素颜色,而MIDDLE_GREY通常是一个可以自己调整的变量。
final_color是经过色调映射之后所要最终输出的颜色。

所以HDR在游戏领域中的真正意义其实是 对场景明暗做动态调整,以模拟人眼对场景感光的调节特性,从而让
玩家感知更丰富的明暗变化,但从另外一个层面上看,这种模拟其实和 HDR的广义概念是同样的目的,都是为了
表达出更多的亮度范围,只不过游戏中的HDR只是一种简单的模拟,只是表面看上去像高动态范围的表现而已,
但照相和某些图片领域中的HDR却是一种更高成本的实现(比如HDR图片格式)可以做到更好的效果。两者目的一
样,但实现成本方法不一样。(另外游戏中的HDR,其实完全不需要用到浮点纹理)

关于bloom
最后补充下,bloom和HDR完全是两个东西,bloom仅仅是表现泛光,在HDR的通常步骤中,往往一些做法是对超
出1.0的像素做bloom,这样可以更好的模拟高动态范围光的效果(比如站在屋内往屋外的景色看起来泛光一片)
,但我这里要说的是bloom是单独的一种技术,bloom可以表现在许多地方,实现许多丰富的效果,而并不仅仅
只为表现HDR,所以请把HDR与bloom区分开来。

这个帖子我尽量用通俗的方式把HDR解释一遍,只希望对许多新人或对HDR不明所以的人有所帮助。
理论归理论,做归做,实际的做法却多种多样,理论和做永远是跨越几个层次的难度,所以这就是国内许多公
司看上去懂原理,但最后真正做出来的结果都很粗糙。

这也是为什么国内网游在渲染上的表现 总是很不专业的原因。
这里附上一张 典型的国产网游的截图(剑网三),
滥用bloom,不理解HDR和bloom之间的联系,不了解HDR对游戏的真正作用,最终导致的就是这种渲染结果。


(这里说明下:我并不是天朝游戏圈里的,所以我往往都是实话实讲,毕竟我也是从这个烂圈子里走过来的人
,只能说我对这个圈子太了解,我这个人从来不会主动去贬损某个人(因为这是很LOW的行为),我只会抨击一个
圈子的某种风气和现象,所以我一直都是对事不对人,在这个论坛里我也做了很多分享,比起那些0分享、一上
来就发人身攻击帖的loser也要强许多)
一些人技术水平如何我心里都有数,无论你在什么公司,什么职位都并不能代表你的真实水平,有一点,人品
和技术永远是成正比的,做的东西往往最能准确的反应这个人实力,一个人是骡子是马,也要看他做了什么东
西。一些人P也没做出来过,也自称专家,这样的人应该去治


少点"专家",多点实干者,少点装B,多点实际意义的分享,也只有这样才能本质上改变一个行业的风气和水平

.






Rank: 9Rank: 9Rank: 9

注册时间
2016-5-6
积分
239
发表于 2017-2-28 20:47:30 |显示全部楼层
本帖最后由 升级君 于 2017-3-3 02:14 编辑

HDR技术对于拍照摄影领域的作用和意义:

因为无论传统胶片相机还是数码相机所能存储感知的亮度范围都存在局限性,
所以摄影师在拍摄一张正对着阳光的照片的时候通常会出现这种问题。

(PS:曝光度通常是指 相机感光元器件所接受的光线的多少)

如果相机曝光度打的过高 天空和云彩部分就直接变的曝白,见图1:


于是摄影师又把相机曝光度打低,但同时又出现了新的问题,
天空白云部分虽然暗了下来,但山下和树林的区域却成了死黑一片,见图2:


打个比方,如果人眼对亮度的感知范围是0-1000, 那普通相机的所能感光的亮度范围只有0-100,
所以相机对照片亮度范围的存储存在局限性,所以这种拍出来的照片实际就丢失了许多细节。导致了一些照片亮的地方会曝白,而暗的地方会死黑.
而为了解决这个问题,一种叫HDR的技术产生了,这种技术的目的就是让照片中死黑的地方亮出细节,而曝白的地方也能暗下来并能显示出细节。

制作HDR照片的方式有很多种,一种比较简单的方式就是,分别用低曝光度、中曝光度、高曝光度对同一景物进行拍摄并得到三种曝光度不同的照片,然后最后进行一种技术上的合成,得到最终效果如图:



你会发现,合成后的HDR照片,特别亮的地方也不曝白了,而暗的地方也不死黑了。
这种HDR图片一般采用的浮点格式,每个像素的通道对应32位,相比传统的8位通道图片格式能存储更广泛的亮度数据。

不过在合成制作好了HDR照片之后,还需要把这种32位存储格式的浮点图片显示在 只有8位的0-255范围的普通显示设备上,所以就需要一种叫 toneMapping的公式来来进行转换和压缩,从而最终在显示器上绘制出 HDR照片。

这种toneMapping公式的为:T = L / (1 + L)
L为转换前的颜色值,T为转换之后的颜色值。


从拍照合成HDR照片,再到tonemapping,这一系列过程的目的就是为了把真实世界中的完整亮度范围的景物通过拍照能完整的还原到低动态范围显示设备上,这就是HDR技术在照相领域的运用,以上整个过程也就是HDR这个技术本身。


(PS:我们人眼一般看物体无论是特别亮的还是特别暗的都看的很清晰,这就是因为人眼对明暗的感知范围比相机广的多,所以人眼本身就是一个完美的HDR设备。)


而游戏中所谓HDR技术的最终目的则又不一样,因为游戏中需要这样一种效果:
玩家在屋内的时候看屋外是一片泛白,玩家走出屋内的时候,屋外又从泛白渐渐变暗变清晰,反过来同理,最终效果和人眼对光线的自适应调节其实是完全一样的。这也是游戏里的HDR技术的实际目的和意义。

所以游戏里为了实现这个效果,必须需要每帧去计算当前整体环境的平均亮度,然后根据这个亮度动态调整整个场景颜色的明暗度,最后再用一个toneMapping公式把当前得到的亮度值映射到最终的0-255内的区间。

这里的tonemapping公式为
final_color *= MIDDLE_GREY / lum;
final_color =  L / (1 + L);
这里lum为当前帧中计算的全屏平均亮度,L为tonemapping之前的源像素颜色,而MIDDLE_GREY通常是一个可以自己调整的变量,final_color为转换后的颜色值.

你是不是发现了 游戏中的tonemapping公式和上面图片压缩中的tonemapping公式存在一点小差别,是的多了一个关键的lum。


最后补充下 在非HDR显示设备上,游戏即使采用用16-32位浮点纹理也并不会有多大作用,因为游戏里的普通颜色纹理依然是8位精度,当然就算游戏中采用HDR纹理,其实最终对效果的提升也很小很小,因为在只有0-255范围内的普通显示器上,就算是在完整的32位光照空间里计算出来的32位颜色值最终还是会被压回0-255。性价比太低。

其实总结一下大家会发现,人们常说的HDR技术中,拍照摄影里的HDR和游戏里的HDR其实完全是两个东西,虽然多少有点联系,但实际上完全是两种概念。希望这篇文章能让更多人对HDR有一个完整的理解。

这次做了重新的整理和补充。
如果有人发现了文中的疏漏,欢迎指正。
原文:http://levelupjun.github.io/
转载请注明作者和出处

使用道具 举报

Rank: 13Rank: 13Rank: 13Rank: 13

注册时间
2015-5-10
积分
1260
发表于 2017-3-1 09:25:30 |显示全部楼层
还是有用的吧,能把原先显示范围外的数据转换到显示范围内
纹理精度会影响最终的效果,但是不能否定HDR本身吧
1

查看全部评分

使用道具 举报

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

注册时间
2010-3-27
积分
6002
发表于 2017-3-1 10:05:59 |显示全部楼层
楼主非科普的吐槽更有意义

使用道具 举报

Rank: 9Rank: 9Rank: 9

注册时间
2016-5-6
积分
239
发表于 2017-3-1 14:38:19 |显示全部楼层
本帖最后由 升级君 于 2017-3-2 15:15 编辑
freshthomas 发表于 2017-3-1 09:25
还是有用的吧,能把原先显示范围外的数据转换到显示范围内
纹理精度会影响最终的效果,但是不能否定HDR本身 ...

我这篇文章并没有任何否定HDR的字句,不知道层主是从哪里看出 否定HDR,实在不解另外 游戏里的HDR实现过程中 浮点纹理的作用一般是用来读取HDR纹理,并用浮点target来计算还原HDR数据,如果不用HDR纹理自然就用不到浮点纹理和浮点target。
当然你可以在不用HDR纹理的情况下,只用浮点纹理来做target,这样可以保证在计算光照的时候能有更高的明暗信息,但记住,无论如何最后还是会被压回0-255。相对于浮点target的开销与对实际HDR效果的提升,这个性价比很低。
请理解我的本意。

使用道具 举报

Rank: 9Rank: 9Rank: 9

注册时间
2016-5-6
积分
239
发表于 2017-3-1 14:42:25 |显示全部楼层
ljb 发表于 2017-3-1 10:05
楼主非科普的吐槽更有意义

某些人看吐槽,某些人看科普,那这篇文章就起到作用(微笑)。

使用道具 举报

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

注册时间
2010-3-27
积分
6002
发表于 2017-3-2 10:48:38 |显示全部楼层
我以前也搞渲染,到了全局光照后就没有动力向前了;现在搞物理模拟,体会更深,不再想吐了。

使用道具 举报

Rank: 9Rank: 9Rank: 9

注册时间
2016-5-6
积分
239
发表于 2017-3-2 14:46:04 |显示全部楼层
ljb 发表于 2017-3-2 10:48
我以前也搞渲染,到了全局光照后就没有动力向前了;现在搞物理模拟,体会更深,不再想吐了。 ...

我建议你还是把基础打好。
这个论坛有许多人都是好高骛远,基础薄弱,经验匮乏和对某些技术的理解都比较混乱,我看了很多贴,大部分人只停留在看paper,抄paper,少部分人能抄点代码做些DEMO,但做出来的东西都很不专业。
空洞实际价值低的帖子太多。一个技术论坛最重要的是知识贡献性,而不是摆设。
不过站长对国外一些 技术文章的翻译倒是颇为良心,这点表示感谢。

使用道具 举报

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

注册时间
2013-11-27
积分
5057
发表于 2017-3-2 19:46:39 |显示全部楼层
期待HDR游戏+HDR显示器的推广

使用道具 举报

Rank: 9Rank: 9Rank: 9

注册时间
2016-5-6
积分
239
发表于 2017-3-2 21:13:13 |显示全部楼层
浙滨 发表于 2017-3-2 19:46
期待HDR游戏+HDR显示器的推广

恩,要实现真正的HDR游戏,确实需要真正的HDR显示器,突破了0-255这个局限,另外还需要把普通的8位相关纹理(比如颜色纹理等)替换成真正的32位的HDR纹理.
HDR显示设备的普及和推广可能还需要时日,不过感觉也快了。到那个时候硬件的性能也足以满足浮点纹理的各种需求

使用道具 举报

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

注册时间
2010-3-27
积分
6002
发表于 2017-3-3 09:54:17 |显示全部楼层
我认为,能理解paper就已经达到一个层次(当然,也与paper有密切关系),能照paper实现出代码说明更上一台阶。楼主如对GI熟悉的话,告知下读过的综述性文章(就我查了的,较凌乱,没有较全面的)。
,我要打基础去了.......

使用道具 举报

Rank: 16Rank: 16Rank: 16Rank: 16

注册时间
2011-3-24
积分
2134
发表于 2017-3-3 12:48:32 |显示全部楼层
请教一下, final_color *= MIDDLE_GREY / lum; 这个里面的MIDDLE_GREY 这个在物理上表示什么的?
还有DX HDRLightlinght 里面下面这段代码
    if( g_bEnableBlueShift )
    {
                // Define a linear blending from -1.5 to 2.6 (log scale) which
                // determines the lerp amount for blue shift
        float fBlueShiftCoefficient = 1.0f - (fAdaptedLum + 1.5)/4.1;
        fBlueShiftCoefficient = saturate(fBlueShiftCoefficient);

                // Lerp between current color and blue, desaturated copy
        float3 vRodColor = dot( (float3)vSample, LUMINANCE_VECTOR ) * BLUE_SHIFT_VECTOR;
        vSample.rgb = lerp( (float3)vSample, vRodColor, fBlueShiftCoefficient );
    }

这个 fBlueShiftCoefficient 的系数计算,有理论依据的吗?

使用道具 举报

Rank: 9Rank: 9Rank: 9

注册时间
2016-5-6
积分
239
发表于 2017-3-3 15:13:34 |显示全部楼层
mayingzhen 发表于 2017-3-3 12:48
请教一下, final_color *= MIDDLE_GREY / lum; 这个里面的MIDDLE_GREY 这个在物理上表示什么的?
还有DX HD ...

MIDDLE_GREY这个值可以用来调整的整体明暗和灰度,不过同时也会把像素值压缩到更小的区间(比0-255更小),所以会让画面变灰,这个tonemapping公式是曲线而不是线性,另外这个公式本质上对图像进行的一种压缩没有所谓的物理意义。

最后我还是告诫层主一下:不要乱看代码。

学技术重在理解与运用,而不是为学而学,把真正需要的用在自己的实际项目里,才能做出专业的东西。

使用道具 举报

Rank: 9Rank: 9Rank: 9

注册时间
2016-5-6
积分
239
发表于 2017-3-3 15:20:13 |显示全部楼层
ljb 发表于 2017-3-3 09:54
我认为,能理解paper就已经达到一个层次(当然,也与paper有密切关系),能照paper实现出代码说明更上一台阶 ...

其实我只是提醒层主,不要去乱看paper,根据实际的需求来学习,项目中遇到问题,可以考虑去参考现有的成熟技术,如果没有再自己去实现,这样至于不会让你走弯路。

关于实时GI,到时我会做一次分享,当然图文和代码我都会附上,我还是尽量用通俗的方式来写。
我这个人写文章,最担心的是别人看不懂,我还是一直认为 能被普通人看懂的文章才有价值。

使用道具 举报

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

注册时间
2010-3-27
积分
6002
发表于 2017-3-3 15:45:53 |显示全部楼层
论坛有生气了,坐等楼主的文章....。感觉楼主从事项目较多,咨询个问题,国内(主要是游戏行业)对物理模拟有多大需求?
,我要打基础去了.......

使用道具 举报

Rank: 9Rank: 9Rank: 9

注册时间
2016-5-6
积分
239
发表于 2017-3-3 16:18:06 |显示全部楼层
ljb 发表于 2017-3-3 15:45
论坛有生气了,坐等楼主的文章....。感觉楼主从事项目较多,咨询个问题,国内(主要是游戏行业)对物理模拟 ...

国内游戏许多都是站桩打怪,对物理的需求自然很低,

游戏里的物理一般通常的作用是,
1.用来实现场景里各种普通物体的爆炸和弹飞,各种运动碰撞效果,这里就需要刚体物理。
2.用刚体物理来绑定铰链来实现绳锁或者头发布料之类的运动效果,参考MMD里的头发和衣服和绳带都是用这种方式。
3.真正实现头发各类布料之类的运动风力的模拟,这里可能需要真正的布料运算来实现,比如physx里的布料组件,TX的天刀也是用这种比较直接的方式。
4.用IK配合骨骼的物理碰撞来实现 人物骨骼与场景各种物体的交互效果,玩家角色可以自由的用手开门,用手抓取某个物体,脚可以自由的根据碰撞选择合适的落脚点等等(PS:HAVOK有这方面的详细组件可用)

如果你是做工程项目,建议直接用现成的物理引擎来做,如果你是做学术项目,我可能无法提供建议。




使用道具 举报

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

注册时间
2010-3-27
积分
6002
发表于 2017-3-3 17:33:10 |显示全部楼层
楼主回复很快,再咨询:
1、根据楼主项目的经验,国内除天刀的布料外(玩过下,还能说几句,应该是在不同的场合分别使用实时运算、骨骼方式、变形动画方式的),还有哪个公司用过物理引擎。网易的天谕(尝试过)?近期的逆水寒(雷声较大)?
2、国内游戏为什么只"站桩打怪",是需求的原因?还是成本原因?还是技术原因?或其它?

使用道具 举报

Rank: 16Rank: 16Rank: 16Rank: 16

注册时间
2011-3-24
积分
2134
发表于 2017-3-3 18:54:57 |显示全部楼层
升级君 发表于 2017-3-3 15:13
MIDDLE_GREY这个值可以用来调整的整体明暗和灰度,不过同时也会把像素值压缩到更小的区间(比0-255更小), ...

嗯,我就是不太明白那个BlueShift到底是干嘛的才问的,希望这方面能介绍一下 。 还有Unreal4 的ToneMap之前有用到 float3 BalancedColor = WhiteBalance( LinearColor ); float3 GradedColor = ColorGrade( BalancedColor ); WhiteBalance 和 ColorGrade 这两个也不是很懂,希望也科普一下。

使用道具 举报

Rank: 16Rank: 16Rank: 16Rank: 16

注册时间
2011-8-1
积分
2315
发表于 2017-3-6 15:29:24 |显示全部楼层
期待LZ的实时GI技术分享

使用道具 举报

Rank: 9Rank: 9Rank: 9

注册时间
2012-3-9
积分
391
发表于 2017-3-8 14:33:07 |显示全部楼层
楼主讲的清晰又透彻,而且对大家非常热心的帮助,游戏界就需要的你这样的人才带来一股清新的风景,我很欣赏你,希望自己也学到你这么厉害的能力能一起推动中国整个游戏界的发展!

使用道具 举报

最近看过此主题的会员

您需要登录后才可以回帖 登录 | 注册

‹‹
我的工具栏

关于我们|手机版|Archiver|开源计算机图形学社区(Open Source Computer Graphics Community) | OpenGPU Project | OpenGPU Forum (2007-2013)

GMT+8, 2017-8-18 12:53 , Processed in 0.113916 second(s), 12 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部