Computer Graphics

浏览量:37

基于物理的渲染

  1. 光的性质 光通常指的是人类眼睛可以见的电磁波,反馈到人眼上就是我们可辨别的颜色。 光谱,是复色光通过色散系统(如光栅、棱镜)进行分光后,依照光的波长(或频率)的大小顺次排列形成的图案。光谱中的一部分可见光谱是电磁波谱中人眼可见的唯一部分,在这个波长范围内的电磁辐射被称作可见光,如图1所示。 图1. 光谱 实际上,我们看到的光并不是单一波长的电磁波,而是由多种波长混合而成。通过棱镜,不同波长的光会分散开来,就能看到所谓的“彩虹”,如图2所示。 图2. 光的色散 光谱能量分布(Spectral Power Distribution,简称为SPD),用于描述复合光中各个波长的色光分别有多少能量。如下图所示,就表示不同的光源发射出来的光的SPD,如图3所示。换个角度说,可见光内任意一个SPD都可以表示一个唯一的颜色,但是任何一种不颜色可能由不同的SPD组成。 图3. 不同光源的SPD 任何看到的颜色是不同能量的电磁波混合而成,而电磁波具有偏振现象,它会朝前进方向的垂直方向偏振,如图4所示。 图4. 光的偏振 偏振片会过滤某个方向上偏振的电磁波,证实了光的偏振现象,如图5所示。 图5. 偏振片 2. 基础概念 本小节介绍与能量相关的基础概念。 2.1. Radiant Energy 辐射能量。 指以辐射形式发射、转移,或接收的能量。 单位是焦耳,J,符号是\(Q\)。 2.2. Radiant Flux 辐射通量。 指的是单位时间到达一块平面的能量总和。 单位是焦耳每秒J/s,或瓦特W,符号是\(\Phi\)。 2.3. Irradiance 辐射度,辐照度,辐射照度。 指的是单位面积接收的辐射通量。

spacer
浏览量:1,005

several color model

The eye is a detector of light whose sensitivity to the quality or wavelength of the light has developed into color perception. Color is the only one of several qualities that go to make up our field of vision. The

spacer
浏览量:1,381

高动态范围光

本篇文章谢绝转载,也禁止用于任何商业目的。文章中的源码实现的下载地址参见https://github.com/twinklingstar20/hdr_demo 1. 色阶重建 色阶重建(Tone Mapping)是什么样的一个技术呢,它与高动态光照渲染(High Dynamic Range, HDR)又有什么关系呢?,且听我娓娓道来。 假设你是一名摄影爱好者,一定听过HDR这个词,它的专业称法为高动态范围成像(High Dynamic Range Image, HDRI),是用来实现比普通图像(每个颜色通道占8位)表示的曝光范围更大的一种技术,高动态范围成像的目的就是要正确地表示真实世界中从太阳光直射到最暗的阴影这样大的范围亮度。举个例子来解释,大晴天出门去摄(zhuang)影(bi),拍摄了图1所示的一张图,一定会被人喷不专业,因为你这是想证明你对自然景色更感兴趣呢,还是对中国的文化遗产更感兴趣呢?照顾了天空的曝光,就使得暗部欠缺曝光。 图1. 想更准确的拍摄天空 你为了证明你是爱中国的文化遗产,你想重点关注建筑物,于是你拍摄了另外一张图,如图2所示,确实证明了你的爱,但是背景又是什么鬼,那是霾吗,大北京这么难能可贵的大晴天,却拍出了雾霾的效果。 分析下造成这个问题的原因,简单来说,照相机拍摄的亮度(Luminance)范围是有限的,如果想要亮部更加清晰,特别暗的区域就显得比较黑;相反,如果想要暗部更加清晰,特别亮的区域就会被截断(Clamp to white)成白色,显得特别的亮。我们想要的结果如图3所示,不仅能清楚的显现出建筑的模样,同时还有一个比较清晰的背景,这就是色阶重建技术达到的效果,它把一个高动态范围的亮度,变换为低动态范围(Low Dynamic Range)的亮度,使仅用低动态范围的亮度能清晰、有效地还原场景的效果,PERFECT!!! 图3. 高动态范围成像技术达到的效果图 再举个例子,如图4所示,我们可以用不同的曝光度,拍摄一组图片,由暗到亮,然后采用色阶重建技术把它变换为一组明暗协调的图片,如图5所示。色阶重建技术,又可以细分为全局色阶重建和局部色阶重建,想要了解各种色阶重建技术可以参见Reinhard etc。 图4. 不同曝光度的一组图像 图5. 全局和局部色阶重建后的图像 至此,介绍了高动态范围成像(HDRI)和色阶重建之间的关系,可以简单把色阶重建技术划分为全局色阶重建和局部色阶重建。接下来,又提出一个问题,在实时渲染中,特别在多光源的光照计算中,为什么存在无法渲染高动态范围的问题呢? 在计算机的颜色缓冲区中,存储的颜色范围是\(\),当多光源的光照计算,由于亮度的叠加,容易导致亮度超过1.0,此时,硬件设备(GPU)会把它截断至亮度1.0,大部分情况下做这样一种截断处理是没有问题的。但是如果一个场景中绝大部分的片断(像素)经过多光源的光照叠加,它的亮度都超过1.0,简单的把颜色截断至\(\)范围内,那么整个场景有会显得曝光过度,物体的细节无法有效的得到呈现,如图6所示,整块区域就显得白花花的。可以模仿摄影中的色阶重建技术,同时渲染多张不同曝光度的高动态范围的图像,再通过色阶重建技术得到低动态范围的图像。那么问题来了,在实时渲染中,颜色缓冲区会把亮度超过1.0的图像自动截断至1.0,换句话说,就是GL_RGB类型的颜色缓冲区是无法存储高动态范围的帧,此时又如何存储渲染出来的高动态范围的帧呢? 图6. 曝光过度的渲染效果 这就有了新的图像存储格式的诞生,最早由Greg Ward在1985年提出了RGBE 32位的图像存储格式,RGB表示颜色值,E(Exponent)表示RBG颜色的指数系数,通过指定不同的E,就能有效的存储不同高动态范围的图像。后续又出现了多种不同的HDR格式的标准,例如Pixar Log Encoding(TIFF)、Radiance RGBE

spacer
浏览量:4,606

伽马校正

本篇文章谢绝转载,也禁止用于任何商业目的。 首先,解释下伽马(Gamma)是什么鬼。 以一个数字照相机为例,光子打到传感器上,显现出图像,如果有双倍的光子打到传感器,就会有双倍的电子信号,它是一个线性的关系。但是,人眼对光的感知并不是一个线性的关系,与照相机相比,人眼对暗色调会更加敏感些,使得人眼能感知的光照范围更加广(我也不知道为什么!!!)。如图1所示,图(1)人眼观测到的50%亮度的,实际上只有百分之二十多;图(2)是照相机捕获的50%亮度的颜色,明显比图(1)更亮。 图1. 人眼观测到的与照相机检测到的亮度对比 这与伽马又有什么关系呢?伽马建立起了一个照相机捕获的亮度与人眼观察到的亮度的对应关系,称之为伽马编码。设输入和输出的光照分别表示为\({{L}_{in}},{{L}_{out}}\),伽马系数为\(gamma\),得到关系等式(1),等式(1)的函数示意图如图2所示。\(gamma\succ 1\)的函数变化曲线如图中的红色曲线所示,\(gamma\prec 1\)的函数变化曲线如图中的蓝色曲线所示。 \({{L}_{out}}={{L}_{in}}^{gamma} \tag{1}\) 图2. 幂函数的示意图 因为人眼对暗色调(Dark Tone)更敏感,我们在存储图像文件的时候,对颜色进行伽马编码(Gamma Encoding),如图3所示,伽马编码产生的颜色带中暗色范围更宽。以相同的位数来表示颜色(例如8位),线性编码(Linear Encoding)可能需要更多的位数才能表现与伽马编码相同的效果。 图3. 以2.2伽马系数进行编码的颜色表对比图 伽马编码可以使得8位就能有效的描述绝大部分场景,但是它使得图像的存储和呈现过程变得更加复杂。(1)图像的存储过程,颜色通过系数为\(1/gamma\)的幂函数进行处理;(2)图像的显示,存储的颜色,需要通过显示器采用系数\(gamma\)的幂函数进行处理,即与图像存储相反的过程,它是显示设备内置的处理过程,我们可以把它理解为所有的显示设备都会行进伽马编码的逆处理。如图4所示,(1)图像伽马处理,把图像保存为JPEG或TIFF,(所有的JPEG格式的文件都会进行伽马编码)会采用系数为\(1/gamma\)的幂函数进行预校正,使得指定的位数有效的表示图像;(2)显示伽马处理,是显示设备对颜色进行的校正,两个过程中和后能有效的呈现的颜色。绝大部分显示设备采用的伽马系数为2.2。 图4. 伽马编码和显示 如果图像伽马处理与显示伽马处理不能达到中和,就会使得呈现出来的图像过暗或者过亮。如图5所示,蓝色表示图像伽马处理曲线,红色表示显示伽马处理曲线,紫色表示两者叠加处理后的函数曲线图,不同的中和结果就会产生不同的效果。 图5. 设图像伽马系数为2.2,与不同的显示伽马系数中和作后呈现出来的效果对比图 至此,我们知道,伽马是什么,为什么需要伽马编码,不同的伽马处理对呈现出来的图像的影响。前面阐述的是伽马编码在摄像机(照相机)从现实生活中捕获图像数据,再呈现到显示设备上影响。而在实时渲染的过程中,图像数据的捕获过程就相当于GPU的渲染过程,它可能没有涉及伽马编码,但是显示设备仍然会偷偷滴地帮我们完成伽马编码的逆处理,那么它会引发什么样的问题呢?很多时候,我们渲染出一帧的图像,都会通过显示设备调整渲染出的效果至到它符合我们预期,其实这个过程也考虑到了显示设备隐藏的逆处理,虽然它调试的显示器上显示正常,可能在不同的伽马系数的显示器就会有不同的呈现效果,而且有些情况,我们需要在渲染上对输出到显示设备的帧数据进行校正,特别是有大量动态范围光照的渲染中。这里引入一个概念,伽马校正(Gamma Correction),它是对显示设备对最终输出颜色逆处理的逆处理过程,没有写错,是逆处理的逆处理。 举个例子来阐述下伽马校正的原理,设颜色\(c=\left( 0.5,0,0 \right)\),显示设备的伽马系数为\(gamma=2.2\)经过显示设备的幂函数处理,实际上我们看到它呈现出来的颜色为\({{\left( 0.5,0,0 \right)}^{2.2}}=\left( 0.218,0,0 \right)\)。但是如果在输出到显示设备前,对它进行伽马校正,即\({{\left( 0.5,0,0 \right)}^{1/2.2}}=\left( 0.730,0,0 \right)\),那么,我们在显示设备上实际看到的颜色为 \({{\left( 0.730,0,0 \right)}^{2.2}}=\left(

spacer
浏览量:1,138

凹凸纹理

本篇文章谢绝转载,也禁止用于任何商业目的。 代码下载地址:https://github.com/twinklingstar20/BumpMapping 1. 凹凸纹理简介 凹凸纹理(Bump Mapping)是计算机图形学中,使物体表面仿真出褶皱效果的技术,该技术通过(1)扰动对象平面的法向量,(2)利用扰动的法向量进行光照计算,来实现。物体表面呈现出来的褶皱效果,不是由于物体几何结构的变换,而是光照计算的结果,凹凸纹理技术的基本思想最早由James Blinn在1978年提出的。凹凸纹理的效果如图1所示,左图是一个光滑的小球,中间图是一张扰动纹理贴图,通过它来扰动小球平面的法向量,再经过光照计算,就能产生右图所示的带有褶皱表面的小球。 图1. 凹凸纹理效果图 2. Blinn技术 2.1. 数学原理 任何一个三维几何面片,可以用三个带有两个变量的参数形式的表示: \(X=X(u,v),Y=Y(u,v),Z=Z(u,v) \tag{1}\) 其中,\(u,v\)的取值在区间之间,几何面片的局部点的偏微分表示该点的两个方向向量: \(\overrightarrow{{{P}_{u}}}=\left( {{x}_{u}},{{y}_{u}},{{z}_{u}} \right),\overrightarrow{{{P}_{v}}}=\left( {{x}_{v}},{{y}_{v}},{{z}_{v}} \right) \tag{2}\) 单位向量\(\overrightarrow{{{P}_{u}}},\overrightarrow{{{P}_{v}}}\)表示与该局部点相切的两个方向的切线,那么该点的法向量可以通过这两个切线向量的叉积得到,如图2所示: \(\overrightarrow{N}=\overrightarrow{{{P}_{u}}}\times \overrightarrow{{{P}_{v}}} \tag{3}\) 图2. 三维几何面片的法向量 实时渲染中的光照计算,特别是漫反射光和镜面反射光(Phong光照模型),依赖平面的法向量,Blinn技术的原理就是,使用一个扰动函数,对平面的法向量进行扰动,再将扰动后的法向量用于光照的计算。图3(a)~(d)描述了Blinn技术对法向量扰动的基本过程。 图3. 法向量的扰动过程 设扰动函数表示为\(F(u,v)\),原始平面上的一个点 \(P\),经过扰动后的位置为: \(P'=P+F\cdot \overrightarrow{N}/\left| \overrightarrow{N} \right| \tag{4}\) 而扰动的法向量\(\overrightarrow{N'}\)仍然可以由两个方向向量的偏微分得到:

spacer
浏览量:3,047

Perlin噪声

本篇文章谢绝转载,也禁止用于任何商业目的 1. Perlin噪声 Ken Perlin在1983年提出了一种渐变噪声,Perlin在1985年的SIGGRAPH有该算法的描述,称之为经典Perlin噪声(Classical Perlin Noise)。为了简化计算,方便使用硬件实现,并解决经典Perlin噪声中存在的错误,到2001年,Ken Perlin再次对原始的噪声算法进行了改进,称之为Simplex噪声(Simplex Noise),这两种算法都可以称为Perlin噪声。但是,我们有时候也把分形噪声也称为Perlin噪声,甚至在严肃的学术论文中都有这种称法。为了避免歧义,本文指的Perlin噪声特指经典Perlin噪声和Simplex噪声。 Stefan Gustavson指出:Simplex噪声有更小的算法复杂度,要求更少的乘法,在\(N\)维空间上,经典Perlin噪声的算法复杂度为\(\log \left( {{2}^{N}} \right)\),但是Simplex噪声的算法复杂度为\(\log \left( {{N}^{2}} \right)\)等优点。虽然Stefan Gustavson提供了对Simplex算法的注解,但是我依然不能理解Simplex噪声背后的数学原理,对Simplex噪声不作进一步阐述。 2. 经典Perlin噪声 经典Perlin噪声是Ken Perlin在1983年提出的噪声,Ken Perlin提供了一维、二维、三维算法的C实现,我们无法仅从他提供的代码理解其数学原理,Matt Zucker从数学原理的角度,对经典Perlin噪声进行了解读。本节将详细介绍二维、三维的Pernlin噪声的数学原理,算法的C语言实现源码如下所示: /* coherent noise function over 1, 2 or 3 dimensions */ /* (copyright Ken Perlin) */ #include

spacer
浏览量:4,262

实时阴影技术

转载请注明原文章链接:http://www.twinklingstar.cn/2015/1717/tech-of-shadows/ 示例代码下载地址:https://github.com/twinklingstar20/twinklingstar_cn_tech_of_shadows/ 1. 阴影介绍 在现实生活中,阴影随处可见,如图1中所示的两个例子,一个温暖窝心,一个浪漫感动。光与物的结合,形成阴影,使得场景更加的真实。如果没有阴影的存在, 这两个场景将变得十分的不自然。 图1. 现实中的阴影 想起高中时学过的一首由马致远创作的小令《天净沙•秋思》 枯藤老树昏鸦 小桥流水人家 古道西风瘦马 夕阳西下 断肠人在天涯 顿时在脑海中闪现一个画面:在深秋村野上,出现了一位漂泊天涯的游子,在残阳夕照的荒凉古道上,牵着一匹瘦马,迎着凄苦的秋风,信步满游,背后拖着长长的身影。 在图形学领域,给出一个阴影的定义: Shadow the region of space for which at least one point of the light source is occluded. (由于光源上存在点被障碍物阻挡而产生的区域,就形成了阴影) 这个定义存在两个局限:(1)只考虑到直接来自于光源的光照,不考虑由平面反射出的光照;(2)默认障碍物是不透明。本篇文章讨论的阴影就基于这两个 “不符合”实际的假设来进行的。 首先,介绍几个与阴影相关的重要概念。阴影渲染中的三个关键元素是:(1)光源,(2)遮挡物(Occluders, Blockers, Shadows

spacer
浏览量:9,204

环境贴图

本文主要首先介绍下什么是环境贴图,然后分别介绍球面贴图,立方体贴图,和双抛物面贴图,比较三种贴图方式的优缺点,立方体贴图的代码的下载地址为:https://github.com/twinklingstar20/twinklingstar_cn_environment_mapping(从NVIDIA网站上下载下来的)。 一. 环境贴图是什么 环境贴图(Environment Mapping,EM)也称为反射贴图(Reflection Mapping),把反射对象当作一个虚拟眼睛,生成一张虚拟的纹理图,然后把该纹理图映射到反射对象上,得到的图像就是该场景的一个影像。举个例子,比如镜子中的图像,就是对真实场景的一个影像。环境贴图这项技术最早由Blinn和Newell提出的【4】,主要实现的功能是:使物体表面能显示出真实场景的影像。如下图所示,小球表面就有周围环境的影像。 图1. 环境贴图 实现环境贴图,很常见到的主要有三种技术:球面贴图(Spherical Environment Mapping),双抛物面贴图(Dual Paraboloid Mapping)和立方体环境贴图。 环境贴图基本的思想如图2所示,假设场景离对象很远而且对象不会产生自我反射,在对象上某一点的影像就能通过反射向量r来确定。 图2. 环境贴图基本思想 那么环境贴图主要分5个步骤: (1)       创建一个2D环境纹理 (2)       计算反射对象上每个像素点的法向量 (3)       基于人眼位置和平面的法向量,计算反射向量 (4)       使用反射向量,计算该像素点在2D纹理上的值 (5)       使用得到的纹理值来绘制像素 基于人眼位置和平面的法向量,来计算反射向量,也很简单,如下面的图所示: 图3. 计算反射向量 接下来分别介绍3种具体的环境贴图的算法和实现,并且分析各种方法的优缺点。 二. 球面贴图 如图1所示,就是一个经典的球面贴图的样例。假设观察者在无穷远处,则所有的入射光线都是平面,如图4所示。 图4. 球面贴图的几何图示,红色表示法向量,蓝色表示反射射线,黄色表示入射光线 现在考虑如何将表面的颜色值与纹理上的纹理值对应起来。如图5所示,从观察者到顶点的坐标值用U来表示,归一化向量U,得到U’。既然是在视点坐标系统下进行的计算,则眼睛被放置在原点,向量U的值就等于顶点在视点空间下的坐标。当前的向量N也被变换到视点空间下,并且进行规一化,得到N’,反射向理就可以通过下面的等式计算得到: \(R = U' - 2(N'

spacer
浏览量:794

How AGP Work(转载)

本文转载于http://computer.howstuffworks.com/agp.htm,对AGP进行了介绍。在图形渲染中主要有三种内存:系统内存(System Memory),显存(Video Memory)和AGP内存(AGP Memory)。系统内存和显存都容易理解,不过AGP内存是什么呢?简单来说,就是把RAM中划出一小块内存,当作显存来用,在“AGP Memory Improvements”小节,有详细的介绍。 Introduction You point, you click; you drag and you drop. Files open and close in separate windows. Movies play, pop-ups pop, and video games fill the screen, immersing you in a world of 3-D

spacer
浏览量:6,178

八叉树颜色量化

本文简单的介绍了颜色量化的几种方法,重点介绍八叉树颜色量化算法,并实现了该算法。算法实现的下载地址(参见下载)。 一. 颜色量化介绍(Color Quantization) 计算机图形学中,常采用的一种方法是把颜色看成是基于红、绿、蓝三种颜色的混合,也可以采用色度、彩度、亮度等描述颜色,用多种不同的描述符来表示颜色,就称为颜色模型(Color Model),如果有人能量化这三种不同的描述符的数值,就可以用一个三元组来表示一种颜色,例如(r,g,b),这就形成了一个描述颜色的三维坐标系统,选择不同的颜色模型能形成不同坐标系统,坐标系统上所有颜色的集合就称为颜色空间(Color Spaces)。 在图形学中,颜色量化是为了减少一张图像中的颜色数并且使用它尽可能的与原始图像一样,在一些由于内存限制只能显示有限颜色的设备上,颜色量化就显得特别的重要,根据参考【5】的总结,介绍几种颜色量化方法,最后重点介绍八叉树颜色量化方法。 1.1   统一颜色量化(Uniform Quantization) 在RGB颜色模型,颜色可以表示成三维空间中的一个坐标,颜色空间可以表示为X,Y,Z轴都在范围的值,这样颜色空间就相当于一个正方体。统一颜色量化的基本思想就是独立的看待颜色空间中的每个坐标轴,把它们平均分成N条线段,这样就能形成一个个小方块,每个方块当作一种颜色。有时候把红和绿的坐标轴分成8段,把蓝色的坐标轴分成4段,这样就可以生成256个小方块,即256种颜色;除此之外,当然还有别的划分方法,例如可以把红色和蓝色分成6段,绿色分成7段,这样就能产生252种颜色。每个方块内的颜色值,可以取该方块所有颜色值的平均值。这种方法实现非常的简单快速,但是产生的结果并不好。 1.2   流行色算法(Popularity Algorithm) 通过某种颜色在图像中发生的频率来进行颜色量化,频率越高的赋予越大的优先级,这种方法不考虑常用的颜色之间是否是相似的,即可能频率较高的几种颜色很相近,但是确实又有不同的颜色坐标。流行色算法基本的做法通过两次扫描来处理:第一次扫描图像,创建一个包括颜色和颜色计数的表,以颜色计数从大到小排序,选择前K种颜色作为这张图像的调色板,别的颜色都丢弃掉;第二次扫描,需要计算图像上的颜色在调色板上的索引值,例如颜色(red,green,blue),通过计算它与调色板上所有颜色距离的平方值dist,找到dist值取最小时的索引i值,就是图像上该种颜色的索引值。 dist=(red - red )^2 + (green - green )^2 + (blue - blue )^2 1.3   中值切割法(Median Cut Algorithm) 与统一颜色量化方法有些相似,也是把颜色空间分成K个子块,使得每个了块尽可能的估计出相同数量的颜色。为了简化说明,这里用二维的平面来解释这个过程,如下图所示。原始图像上的颜色值放到颜色坐标系统上,沿着它最长的维度的中位数位置分成两半,剩下的子块按照类似的方法进行处理,得到右边那张图所示的结果。注意:中位数跟中点不是相同的概念。 图1. 中值切割 算法的基本过程如下所示: (1)       找到包含所有图像颜色的最小方块 (2)      

spacer