六、实时辉光(Real-Time Glow)
【章节概览】
这章讲到2D光照效果中的辉光(Glow)和光晕(Halo),展示了如何通过图像处理方法完全地改善画面及3D人物的渲染感官。
图游戏中的Glow结合Bloom,得到出色的画面效果
图Unreal Engine的logo,即是采用了Glow效果
【核心内容提炼】
光源的辉光(Glow)和光晕(Halo)是自然界到处可见的现象,他们提供了亮度和气氛强烈的视觉信息。
图给强化后的武器加上Glow效果,该武器显得更加强力 TERA
图Glow效果在游戏中的运用 Unreal Engine 4
在观看计算机图形、胶片和刷品时,到达眼睛的光强度是有限的,因此,辨别光源强度的唯一方法是通过它们周围产生的辉光(Glow)和光晕(Halo),具体可以参考[Nakamae et al.1990]。这些辉光可以再现强烈光线的视觉效果,并使观察者感知非常明亮的光源。即使物体周围的微妙光晕也会让人觉得它比没有光辉的物体更亮。
在日常生活中,这些发光和光晕是由大气中或我们眼中的光散射引起的(Spencer 1995)。使用现代图形硬件,可以通过几个简单的渲染操作来再现这些效果。这使得我们可以使用明亮而有趣的物体来填满实时渲染的场景,物体会显得更为逼真或更具表现力,并且这是克服图形渲染中传统的低动态范围图形过于平庸的优雅手段之一。
图有辉光和没有辉光的一个Tron 2.0中的角色对比
有几种方法可以创建场景中的辉光。对于小的类似的点,可以把一个平滑的“辉光”纹理应用到公告牌几何体上,而让公告板几何体在屏幕范围内跟随物体运动。
对于大的辉光源或复杂的辉光形状,要创建辉光,最好对2D场景的渲染进行后处理。这章重点讲到了后处理的实时辉光处理方法。如下图。
图场景实时辉光的步骤(a)正常地渲染场景(b)涂抹所渲染的辉光源,以产生(c)中的一个辉光纹理,将其加到正常的场景画面中,以产生(d)中最终的辉光效果。
渲染后处理辉光的步骤:
Step 1、辉光的指定和渲染(Specifying and Rendering the Sources of Glow)
Step 2、模糊辉光源(Blurring the Glow Sources)
Step 3、适配分步卷积(Adapting the Separable Convolution)
Step 4、在GPU上进行卷积(Convolution on the GPU)
图有效地创建模糊的两步分解法
上图展示了如何有效地创建模糊的两步分解法:首先,在一根轴上模糊于(a)中的辉光源的点,产生(b)中所示的中间结果,然后在另一个轴上模糊这个结果,产生显示在(c)中的最终模糊。
图有辉光和无辉光的Tron 2.0中的英雄Jet
(a)用标准方法渲染3D模型(b)为一个由美术同学创建的辉光源纹理的渲染,目的是指定辉光面积的图案和强度(c)为将辉光应用到标准的渲染结果后,得到的富有表现力的英雄角色效果。
另外,在辉光中使用的这个卷积和模糊方法还可以用于多种其他效果。它能用来计算景深效果的不同聚焦度,景深的信息可以用来控制模糊度。它也能用来模糊投影的纹理阴影的边缘,并且累积深度阴影映射的接近百分比过滤(percentage-closer filtering)结果。
而大面积的卷积能被应用于一个环境映射,以创建一个近似的辐照度映射,从而得到更逼真的场景照明(Ramamoorthi和Hanrahan 2001有相关论述)。用大面积的卷积也可以实现许多非真实感渲染技术和其他的特别效果。其中包括镀着霜的玻璃、模拟衍射的透镜摇曳,以及渲染皮肤时用的近似次表面散射。
大片的模糊和卷积能有效地在多种图像硬件上实时地计算,而处理和创建这些效果的代码可以容易地封装成几个C++类或一个小库。
总之,屏幕辉光是一种很赞的效果,能够容易地扩展到几乎每一种情形,并且变化多端,通过其还够延伸创建出很多其他的效果。最终的效果虽然细微但却有张力,值得在各种游戏中采用。
图 Glow效果在游戏中的运用 Unreal Engine 4
图 有了Glow效果的武器,会显得更强力更炫酷
【核心要点总结】
渲染后处理辉光的步骤:
Step 1、辉光的指定和渲染(Specifying and Rendering the Sources of Glow)
Step 2、模糊辉光源(Blurring the Glow Sources)
Step 3、适配分步卷积(Adapting the Separable Convolution)
Step 4、在GPU上进行卷积(Convolution on the GPU)
【关键词提炼】
实时辉光(Real-Time Glow)
光晕(Halo)
后处理(Post-Processing)
图像处理(Image Processing)
第二部分·次核心内容提炼总结
十六、使用遮挡区间映射产生模糊的阴影(Generating Soft Shadows Using Occlusion Interval Maps)
【章节概览】
这章介绍了一种渲染软阴影的技术,称为遮挡区间映射(Occlusion Interval Maps),能够正确地在静态场景中渲染出光源沿着预定路径移动时产生的模糊阴影。之所以叫遮挡区间映射,是因为此算法使用纹理贴图来存储这种光源可见、而本身被遮挡的区间。
【核心要点】
对于需现实的加油站的Demo,文章一开始本打算使用一种预计算的可见度技术,例如球谐光照(Spherical Harmonic Lighting[Sloan et al.2002])来实现,但可惜的是无法达到目的,因为球谐光照适用的是非常低频的光照,不适用于像太阳那样小面积的光源。所以后来才开发出遮挡区间映射这种新的预计算可见度的技术,它能够支持实时太阳照射的软阴影。通过把问题简化为在固定轨道上的线性光源来达到目的。
需要注意,遮挡区间映射(Occlusion IntervalMaps)技术有一些局限性,只对沿固定轨道传播的单条光线的静态场景适用。这意味着它对人物和其他动态物体的阴影无效。但是其适用于静态户外场景中的阴影渲染。并且此技术因为遮挡区间映射对每个通道需要8位的进度,纹理压缩将导致视觉效果失真。因此,必须禁用纹理压缩,从而增加了纹理用量。
使用遮挡区间映射(Occlusion Interval Maps)技术,通过损失一定运行性能来获得在静态场景上实时运行的软阴影算法。遮挡区间映射(Occlusion Interval Maps)可以用作静态光照贴图的替代品,从而实现动态效果,可以得到从日出到日落光照明变化的动态效果。如下图。
图 加油站入口
注意加油站墙上的阴影在图形的左上方有清楚的边界,但是它朝着右下方变得模糊而柔软。这种相联系的清晰和模糊的变化是真实感软阴影的重要性质,而这是由遮挡区间映射得到的。
图 汽车上方的木板在篷布上形成的阴影
上图中汽车篷布上的木板形成了复杂的阴影。这对算法来说是最坏的情况。这些木头条使得篷布上的遮挡区间映射必须存储在5个不同的纹理中,对于场景中的大多数物体,4个纹理就足以取得所有的阴影。
【关键词提炼】
阴影渲染(Shadow Rendering)
软阴影(Soft Shadows)
遮挡区间映射(Occlusion Interval Maps)
十七、透视阴影贴图(Perspective Shadow Maps:Care and Feeding)
【章节概览】
透视阴影贴图(Perspective Shadow Maps,PSMs)是由Stamminger和Drettakis在SIGGRAPH 2002上提出的一种阴影贴图(Shadow Maps)流派的方法。
透视投影贴图方法的基本思想是,为了减少或消除阴影贴图的失真走样,对投射到大像素区域的物体取最大的阴影贴图纹素密度。
这章提出了一种优化透视阴影贴图(Perspective Shadow Maps)方法的新思路,对其三种缺陷都一一进行了改进。
【核心要点】
这章首先讲到动态阴影的创建,目前主要有两个算法流派:
•阴影体(shadow volumes)/模板阴影(stencil shadows)
•阴影贴图(Shadow Maps)
阴影体和阴影贴图算法之间的不同之处在于,是涉及到物体空间(object space)还是图像空间(image space)。
•阴影体(Shadow Volumes)是物体空间(Object Space)的阴影算法,通过创建表示阴影遮挡的多边形结构来工作,这意味着我们始终具像素精确但较“硬”的阴影。此方法无法处理没有多边形结构的对象,比如经过alpha测试修改的几何图形或经过位移映射的几何体(displacement mapped geometry)。此外,绘制阴影体需要大量的填充率,这使得很难将它们用于密集场景中的每个对象上,特别是在存在多个灯光时。
•阴影贴图(Shadow Maps)是图像空间(Image Space)的阴影算法,它可以处理任何物体(如果能够渲染一个物体,就能得到它的阴影),但是存在走样(aliasing,锯齿)的问题。走样时常发生在有较宽或全方位光源的大场景中。问题在于阴影映射中使用的投影变换会改变阴影贴图像素的大小,因此摄像机附近的纹理像素变得非常大。因此,我们必须使用巨大的阴影贴图(四倍于屏幕分辨率或更高)来实现更高的质量。尽管如此,阴影贴图在复杂场景中却比阴影体要快得多。
透视阴影贴图(Perspective Shadow Maps,PSMs)是由Stamminger和Drettakis在SIGGRAPH 2002上提出的一种阴影贴图(Shadow Maps)流派的方法,通过使用在投射后空间(post-projective space)中的阴影贴图来去除其中的走样,而在投射后空间中,所有近处的物体都比远处的大。不幸的是,使用原始算法很困难,因为只有要某些情况下才能正常工作。
以下是透视阴影映射算法的三个主要问题和解决方案:
1、当光源在摄像机后面的时候,有一个虚拟的摄像机锥体。若在锥体内保持所有潜在的阴影投射体,阴影质量就会变得很差。
解决方案:是对光源矩阵使用特别的投射变换,因为投射后空间可以使用某些在通常空的世界空间中不能做的投射技巧。它使我们可以建立特殊的投射矩阵,可以看做“比无限远更远”。
2、光源在摄像机空间中的位置对阴影质量影响很大,对于垂直的方向光,完全没有走样问题,但是当光源朝向摄像机并迎面靠近它时,阴影映射走样就很严重。
解决方案:把整个单位立方体保持在一个阴影贴图纹理中,对于遇到的问题,有两个办法,每个办法仅解决问题的一部分:单位立方体裁剪法,把光源摄像机对准单位立方体的必要部分;立方体映射法,使用多个纹理来存储深度信息。
3、最初的文章没有讨论过偏置(bias)问题。偏置是随透视阴影贴图而带来的问题,因为纹素的面积以不均匀方式分布,这意味着偏置不再是常量,而是与纹素的位置有关。
解决方案:使用在世界空间中的偏置(而且不再分析双投射矩阵的结果),然后把这个世界空间偏置转换到投射后空间。
图得到的阴影实时渲染结果(多边形10w~50w个,分辨率1600x1200)
【关键词提炼】
阴影渲染(Shadow Rendering)
阴影贴图(Shadow Maps)
透视阴影映射(Perspective Shadow Maps,PSMs)
紧邻百分比过滤(percentage-closer filtering,PCF)
单位立方体裁剪法(Unit Cube Clipping)
十八、逐像素光照的可见性管理(Managing Visibility for Per-Pixel Lighting)
【章节概览】
这章讲到了可见性在逐像素渲染光照场景中的作用,也考虑如何使用可见性减少必须渲染的批次数量,从而改善性能。
【核心要点】
如下伪代码说明在一个场景中必须渲染的批次数:
- For each visible object
- For each pass in the ambient shader
- For each visible batch in the object
- Render batch
- For each visible light
- For each visible shadow caster
- For each pass in the shadow shader
- For each shadow batch in the object
- Render batch
- For each lit visible object
- For each pass in the light shader
- For each visible batch in the object
- Render batch
复制代码
正如伪代码所述,为了减少批次数,可以进行一些与非可见性相关的优化。最应该优化的是渲染每个光照所必须的通道数。批次数随通道数线性增加,因此,我们应该最小化受限于CPU的游戏通道数。
我们可以使用可见性来减少批数。其中,为了减少批次,各个部分(可见部分、光源部分、光照部分、阴影部分)的集合分开讨论并生成。
可见性不仅能有效改善CPU的性能,也同样可以改善GPU的性能。对模板体执行逐像素光照时,填充率的消耗(模板体的填充或多次渲染大的物体)很快就变成了瓶颈,但可以使用剪切矩形(scissor rectangle)限制显卡渲染的面积,解决此问题。
逐像素的照明需要大量的批次数和极高的填充率,所以要减少渲染的物体数和它们影响的屏幕面积。而使用这章中介绍的标准可见性算法和技术,可以充分改善运行性能。
图不在可见集合中的对象可能会影响渲染场景
【关键词提炼】
逐像素光照(Per-Pixel Lighting)
可见性管理(Managing Visib1ility)
性能优化(Performance Optimization)
批次(Batch)
十九、空间BRDF(Spatial BRDFs)
【章节概览】
这章主要先聊到了空间双向反射分布函数(SBRDF),接着文章讨论了压缩SBRDF表达式,以及由离散光或环境贴图所照明的SBRDF的渲染方法。
【核心要点】
SBRDF是纹理贴图和双向反射分布函数(BRDF)的组合。纹理贴图存储了反射或其他的属性,它们沿着2D表面上的空间变化,而BRDF存储的是表面上单个点的反射,包括从入射角到出射角的全部分布。
图SBRDF的定义域
SBRDF对标准点光源或方向光源照明的SBRDF表面,文中直接贴图了Shader源码,具体可以参考原文。
SBRDF除了可以用点光源或方向光源照明之外,还可以用环境贴图中所有方向的入射光进行照明。关键是在渲染前用BRDF的一部分卷积环境贴图。对于大多数的BRDF表达式,必须分别处理各个不同的BRDF。但因为一个SBRDF可能有上百万个不同的BRDF,所以这样做不可能。这篇文章采取的的做法是,简单地用一个Phong叶片卷积环境贴图,叶片可以选择不同的镜面指数,如n=0、1、4、16、64、256、这些贴图能存储在不同级别的立方体mipmap中。随后,SBRDF纹素的n值就指细节层次(LOD),用于在立方体贴图中采样适当mipmap级别。
图用蓝色的油漆和铝BRDF得到的SBRDF渲染效果
【关键词提炼】
双向反射分布函数(BRDF)
空间双向反射分布函数(SBRDF)
离散光(Discrete Lights)
环境贴图(Environment Maps)
二十、基于图像的光照(Image-Based Lighting)
【章节概览】
这篇文章打破了当时立方体贴图环境(Cube-Map Environment)用法的桎梏,深入研究了更多可能的逼真光照效果。文章主要研究了基于图像的光照(Image-Based Lighting,IBL),包括局部化的立方体映射,类似于使用基于图像的局部光照(Localizing
Image-Based Lighting),然后介绍了如何把哪些重要的技巧用于着色模型,包括逼真的反射、阴影和漫反射/环境项。
【核心要点】
立方体贴图通常用于创建无限远环境的反射效果。但是使用少量Shader算法,我们可以将物体放置在特定大小和位置的反射环境中,从而提供高质量的基于图像的光照(Image-Based
Lighting,IBL)。
在室内环境移动模型时,最好是使用近距离的立方体贴图,距离的大小与当前的房间类似。当模型在房间移动时,根据模型在房间中的位置,适当地放大或缩小放射。这种方法得到的模拟效果使人感到更为可靠和逼真。尤其在包含窗户,屏幕和其他可识别光源的环境中。而只要加入很少的Shader数学就能将反射局部化。具体可以看原文贴出的Shader源码。
图不同位置上的局部反射
另外,我们可以将3D几何体做成立方体贴图,并且在正常地渲染环境的时候,把贴图应用到该环境的物体上。也可以使用贴图作为环境,把它投射到较简单的几何体上。
立方体贴图也能用来决定漫反射光照。Debevec的HDRShop程序能够从映射立方体光照环境积分出全部的漫反射贡献度,那么通过把表面法线带入预先卷积的立方体贴图,能够简单地查询漫反射贡献。
基于图像的光照为复杂的光照计算提供了综合而廉价的替代品,将一点数学加入纹理方法,可以大大拓宽“简单”IBL效果,给3D图像提供更强的的方位感。
【关键词提炼】
基于图像的光照(Image-Based Lighting,IBL)
立方体贴图环境(Cube-Map Environment)
基于图像的局部光照(Localizing Image-Based Lighting)
二十一、纹理爆炸(Texture Bombing)
【章节概览】
这章介绍了纹理爆炸(Texture Bombing)和相关的细胞技术,它们能在Shader中增加视觉的丰富性,图像的多样性,并减少大块纹理图案的重复性。
【核心要点】
纹理爆炸(Texture bombing)是一种程序化技术,它把小块图像以不规则的间隔放置。有助于减少团案的失真。
纹理爆炸的基本思想是把UV空间分为规则的单元栅格。然后使用噪声或者伪随机函数,把一个图像放在任意位置上的各个单元中。最终的结果是在背景上对这些图像的合成。
由于要组合数以百计的图像,因此实际上这种合成(composite)图像的方法效率并不高。而程序化(Procedural
)计算图像虽好,但是又不适合合成。这篇文章主要讲了图像合成和程序化生成这两种方法,可以发现他们各有优劣。
图纹理爆炸效果图
很显然,纹理爆炸也可以扩展到3D中,即3D程序化爆炸(Procedural 3D Bombing)
图程序化的3D纹理爆炸效果
纹理爆炸有一种有趣的变化是在平面上画Voronoi区域。简言之,给定一个平面和那个平面上的一系列的点,接近那个点的面积就是点的Voronoi区域。Voronoi图案类似于树叶和皮肤上的单元形状、龟裂的泥土或爬虫类的皮。如下图。
图Voronoi区域
总之,纹理爆炸和相关的细胞技术可以给Shader增加视觉的多样性。使用存储在纹理中的伪随机数表和一个小程序,可以增大一个图像或一组图像的变化,并减少大块纹理区域的重复。
【关键词提炼】
纹理爆炸(Texture Bombing)
3D程序化爆炸(Procedural 3D Bombing)
Voronoi区域(Voronoi Region)
二十二、颜色控制(Color Controls)
【章节概览】
这章将在游戏中图像处理的讨论,扩展到技术和艺术上控制颜色的方法和应用,包括将图像从一些的色彩空间中移入移出,以及快速地给任何2D或3D场景加上精美的色调。
【核心要点】
色彩校正(Color Correction)是几乎所有印刷和胶片成像应用的一部分。色彩校正可用于将彩色图像从一个色彩空间移动到另一个色彩空间。
我们在电视、杂志和电影中剪刀的大部分图像,都经过了非常小心的彩色校正和控制。对于这个过程的理解,可以帮助开发者在实时应用程序中得到同样华美的视觉效果。
色彩校正通常有两种做法:一是各个通道的校正,分别是改变红色、绿色和蓝色各成分;二是混色操作,基于红、绿、蓝各个成分的同时操作,得到每个通道的输出值。
色彩校正的机理可以简洁而容易地在一个shader中描述。重要的是,美术和程序员使用的普通工具就能有效地控制他们。在这章中,运用Photoshop创建控制资源,然后通过像素shader应用到实时程序中。
在Photoshop中提供了一些基于通道校正的工具。如级别(levels)和曲线(Curves)工具。
其中曲线是仿制了化学中的交叉处理(cross-processing)外观,确切地说,就是在C41化合物中处理E6叫绝所产生的假颜色外观。这样的处理已在印刷、电影和电视领域使用多年。
图重新创建交叉处理效果的Photoshop曲线
图伪交叉处理(a)原始图(b)曲线调节之后
可以使用下面几行shader代码运用于输出颜色,使用色彩校正纹理映射,可以随意地用曲线工具重新创建任何色彩变化:
- float3 InColor = tex2D(inSampler, IN.UV).xyz;
- float3 OutColor;
- OutColor.r = tex1D(ColorCorrMap, InColor.r).r;
- OutColor.g = tex1D(ColorCorrMap, InColor.g).g;
- OutColor.b = tex1D(ColorCorrMap, InColor.b).b;
复制代码
也就是说,使用每个原始的红、绿和蓝像素的灰度值,确定在梯度纹理中我们寻找的相关位置,然后由梯度纹理本身定义对新颜色的重映射,即由复杂曲线调节所定义的新颜色,如下图。
图对红、绿、蓝通道重映射结果
【关键词提炼】
颜色控制(Color Controls)
色彩校正(Color Correction)
基于通道的颜色校正(Channel-Based Color Correction)
灰度变换(Grayscale Conversion)
色彩空间变换(Color-Space Conversions)
图像处理(Image Processing)
二十三、景深(Depth of Field)
【章节概览】
本章主要介绍如何使用GPU创建实时的景深(Depth of Field)效果。
图实时景深效果 Crysis 2
【核心要点】
物体在距离镜头的一个范围之内能够清晰成像(经过聚焦),在那个范围之外(或近或远)则成像模糊,这种效果就是景深。在相机业和电影业中,景深经常用来指示对场景的注意范围,并且提供场景深度的感觉。在本章中,把这个聚焦范围远的区域称为背景(background),在这个范围前的区域称为前景(foreground),而在范围外的面积称为中景(midground)。
景深效果由透镜的物理性质产生。若要穿过摄像机透镜(或人眼镜的晶体)的光辉聚到胶片(或人的视网膜)上的一个点,光源必须与透镜有着特定的距离。在这个距离上的平面称为焦平面(plane in focus)。不在这个精确距离上的任何东西,投影到胶片上的区域(而不是一个点)称为模糊圈(circle of confusion,CoC)。Coc的直径与透镜尺寸和偏离焦平面的距离成正比。偏离距离小到一定程度,CoC会变得比胶片的分辨率更小,摄影师和摄影师称这个距离为聚焦(in focus),而在这个范围之外的任何东西都是没有对准聚点的(out of focus,模糊的)。如下图。
图 薄的透镜
图 模糊圈(circle of confusion)
这章中主要综述了5种近似景深效果的技术。
1、基于光线追踪的景深(Ray-Traced Depth of Field)[Cook et al.1984]
2、基于累积缓冲的景深(Accumulation-Buffer Depth of Field)[Haeberli and Akeley
1990]
3、分层景深(Layered Depth of Field)[Scofield 1994]
4、前向映射的Z缓冲景深(Forward-Mapped Z-Buffer Depth of Field)[Potmesil and
Chakravarty 1981]
5、反向映射的Z缓冲景深(Reverse-Mapped Z-Buffer Depth of Field)[Arce and Wloka
2002,Demers 2003]
【关键词提炼】
景深(Depth of Field)
基于光线追踪的景深(Ray-Traced Depth of Field)
基于累积缓冲的景深(Accumulation-Buffer Depth of Field)
分层景深(Layered Depth of Field)
前向映射的Z缓冲景深(Forward-Mapped Z-Buffer Depth of Field)
反向映射的Z缓冲景深(Reverse-Mapped Z-Buffer Depth of Field)
图像处理(Image Processing)
二十六、OpenEXR图像文件格式与HDR(The OpenEXR Image File Format and HDR)
【章节概览】
这章中,大名鼎鼎的工业光魔公司的Florian Kainz、Rod Bogart和Drwe
Hess介绍了OpenEXR标准,这是一种当时新的高动态范围图像(HDRI)格式,在计算机成像的顶级电影中正在快速推广。对于基于图像照明的开发者而言,OpenEXR是关键的工具。
【核心要点】
OpenEXR是由工业光魔(Industrial Light&Magic,ILM)公司开发的高动态范围图像(high-dynamic-range image,HDRI)文件格式。OpenEXR网站是http://www.openexr.org,上面有关于此格式的全部细节。
下图是一个例子,说明了需要HDR存在的原因。
如下图是一张显示相当高的动态范围的场景,场景中左边的油灯的火焰比中间小盘子下的阴影大约亮100000倍。
图高动态范围场景
图像曝光的方式导致了一些区域的亮度超过了1.0,在计算机显示屏上,这些区域被裁剪(clipped)掉,并显示为白色或不自然的饱和桔色色调。
我们可以通过把图像变暗来校正白色和橘色区域,但是如果把原始图像存储在低动态范围文件格式中,如JPEG格式,把它变暗就会产生相当难看的图像。如下图。
图普通文件格式导致明亮的像素值被不可逆地裁剪,使得明亮的区域变灰,并且细节丢失,得到极不自然的效果
而如果原始图像存储在高动态范围文件格式中,如OpenEXR,保存明亮的像素值,而不是把他们裁剪到1.0,然后把图像变暗,就可以产生依旧自然的效果。如下图。
图上述变暗的图的高动态范围版本。在明亮的区域中显示出了其他细节,颜色看起来很自然
文章随后还讲到了OpenEXR的文件结构、数据压缩、使用、线性像素值、创建和使用HDR图像相关的内容。有兴趣的同学可以查看原文,这里就不再赘述了。
【关键词提炼】
高动态范围(High-Dynamic-Range,HDR)
高动态范围图像(High-Dynamic-Range Image,HDRI)
OpenEXR
至此,《GPU Gems 1》全书核心内容提炼总结,上下两篇,完。
With best wishes.
作者:毛星云
专栏地址:
|