谈谈图形学中的光和颜色

之前在查询Physically Based Rendering(PBR)资料的时候偶尔翻到了几篇关于光和颜色的博客,才知道原来在我写的shader里一直在用的RGB值的由来,也去阅读了Real Time Rendering(4th Edition)第八章的相关内容,所以这篇算是一个读书笔记吧。

  1. Radiometry(光能测量学)
    顾名思义,这门学问是测量电磁辐射的。在这里我并不是要来解释这门学问或者将原文这段翻译一下,而是要记录下这段的两个要点。
    第一,人眼的可见光波长范围在[400nm,700nm]


    可见光波长

第二,光度学所测量的四个重要方面:radiant flux,irradiance,radiant intensity以及radiance


Radiometric quantities

首先来看第一个辐射功率(radiant flux)。我们知道,光都是携带能量的。我们把一束光在我们感知到的一瞬间(1帧)所发出的能量记为radiant flux。一束光中包含了多个光波,每个光波波长不一,波长越长则radiant flux越小。

irradiance,中文为辐照度,这个量是关于感受器(比如说视网膜)的。由于radiant flux无法直接度量感受,想象下一个灯泡在极短的时间内向四周发射光线,不能说谁的视网膜面积大所以感受到的光强吧?所以我们用irradiance来度量,指单位面积接受到多少radiant flux。对于点光源来说,irradiance = radiant flux / 4\pi r^2,球的面积是4\pi r^2

第三个radiant intensity,与irradiance用来衡量光能接收器相对的,是衡量光能发出器的一个东西。由于光子从发光源发射之后,随着距离的增加光子分布的越稀疏,在不同距离的irradiance也是不同的,所以拿irradiance来度量并不是一个好的选择。radiant flux可以用来作为衡量的一个标准,但更常用的方式是以发射源作为球心,测量单位球面度上的光子的总能量,这个量用intensity(强度)来表述,intensity = radiant flux / 4\pi。为什么要除以4\pi呢?首先要明白什么是球面度,角度是二维圆弧上对应的角度,那么球面度就是三维球上一个弧面对应的球心角度,整个圆的角度为2\pi,整个圆弧长为2\pi r^2,那么整个球面度为4\pi,球面积为4\pi r^2。在游戏引擎中,通常用intensity来衡量光源的强度,而且intensity和irradiance可以相互转化,intensity = irrandiance * r^2,如果r=1即在单位球上,他们俩相等。

radiance,辐射率,是用于成像的接收器的度量。上文提到的irradiance在视网膜或者摄像机成像中,是不能成像的。理论上视网膜的一个细胞会接受来自场景每个点的光能反射,这些irradiance互相相加平均才产生模糊的像。人眼是个小孔成像系统,其机制是选出一小束光使其通过小孔,射到接收器上。之后就可以用radiance来度量,其表述的是总的光能radiant flux在极小球面度和极小球面积上的值,那么

radiance = \frac{dradiant flux}{d w * d area * cosθ}

w是球面角,area是光线与表面接触的球面积,cos\theta是要算与光线垂直截面的面积。

我们一般用L来代表radiance,它由5个变量所决定(或者6个,包括波长),写成函数即L(p,d)。p为光线的起点,d是方向。在渲染方程里,经常出现L_i(x,d)或者L_o(x,d),代表从点x处发出或射入点x处的光线,d为光线的方向,经常是从x处向外指,是为了计算比如说点积的方便。有了L,我们就可以描述渲染要解决的数学问题了。我们将屏幕当做一个小孔成像系统,追踪在场景中穿过其的每条光线L_i并对其积分,即为像素获得的能量,也就是pixel shader(fragment shader)的最终输出,由于L_i的单位是w/m^2sr,所以这个积分要在每个球面角和每个球面积上进行。

  1. Photometry(光度学)
    以上是光的能量的测量问题,但我们人眼感受到的光和以上所述又有不同,国际照明组织(CIE)给出了一条曲线,叫photometric curve,乘上这条曲线,可以将Radiometry转成Photometry。


    The photometric curve

那么上面所说的四个量也就能转成人眼所能感受的量了。


我们通常用Luminance表达亮度,HDR电视屏幕的峰值亮度为500-100尼特(nit),干净明亮的天空为8000尼特,一只60w的电灯泡为120000尼特,太阳为600000尼特。

  1. Colorimetry(色度学)
    人眼中有三种感受光的视杆细胞,每种细胞会对不同波长的光产生不同的反应,但传到大脑中的信号只有三种,而可见光有七种颜色即七种波长,那么到底传到大脑中的是哪三种特定波长即颜色的信号呢?国际照明组织(CIE)做了实验,用人肉的方式得出了结论,即我们现在所熟知的RGB三原色。


这三种颜色的叠加造成了我们能看到超过千万种不同的颜色。然而,这种人肉实验得出的曲线在某些范围内有负值,显然,在这种状态下我们不能用rgb来表达某些颜色了。所以,rgb不能表达所有的颜色,只是对颜色的降维表达,真正要表达颜色还是需要用光谱。
那么,好不容易找到了三原色不可能因为这就抛弃不用吧?事实上,CIE通过一系列的操作,提出了另一种rgb的曲线


虽然在现实中不存在这样的曲线图,但却能表达人类所能看见的所有颜色了。将rgb作为xyz的空间坐标,即能得到颜色空间的图


然后将这三维空间投影到x+y+z=1的二维平面(因为z可以通过1-x-y获得),则得到了一个马蹄形的色域图


色域图

我们人眼所能见的颜色都在这张图里,那个在白色三角形内的颜色代表sRGB这种颜色标准所能表达的全部颜色,黑点是白点,是纯白色的所在。我们现在很多设备的显示都是遵循sRGB这种颜色标准的,所以,当你盯着屏幕的时候,其实你能看到的颜色比现实中少很多。当然有许多其他的颜色标准,可以把这个三角形区域扩大很多,但依然有许多颜色不能被物理设备所展现,毕竟rgb是低维的表达,而不是光谱。


不同标准所能表达的颜色区域

那么,radiometry是在表述光的能量,photometry在表述人眼所能辨别的光能,colorimetry在表述人眼所见的颜色,他们之间有什么关系呢?其实,光能强不强和人眼所见的光能强不强是两回事,而人眼所见的光强不强和反馈在rgb这三个量上的数值又是两回事,落实到游戏领域,我们渲染的最终结果还是基于人的感知空间的色度作为度量来进行光照计算。

  1. Scene to Screen(场景到屏幕)
    前面经过光照计算所得的颜色代表了我们所感知的场景的颜色,然而把它输出给屏幕,在屏幕上显示的颜色是否是我们感知的颜色呢?答案是否定的。首先,人眼有自适性,场景的亮和暗会对物体的颜色产生影响,并且,物体在不同颜色的环境中,人眼也会看到不同的颜色。如图,你感受到的颜色一样么?


    对比图

其次,所有的物理设备显示的颜色范围是有限的,场景的颜色范围远远大于物理设备所能显示的颜色数量,所以我们需要一些技术,比如HDR,把物理设备显示的颜色范围提高一些,或者,把较宽的颜色范围对应到一个较窄的范围内。

基于这些不同,toon mapping应运而生。这种技术把真实场景中的颜色转成人眼感知的颜色,以达到在屏幕上显示的颜色在被人看到后能够让人还原当时的场景,而不会让人感觉场景很假。


Toon Mapping的使用阶段
Toon Mapping目的

PS. 这是今年的最后一篇博客了,看了下电脑上的便签,还有8个主题想要写成博客(也许会增加),希望能在明年第一季度写完!

参考
RTR4 拾遗(一)-- 图形学的B面
颜色 /About Color --图形学的B面(二)
PBR--RTR4笔记--第八章 光与颜色

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342