精华内容
下载资源
问答
  • GPU Gems 3 pdf 电子书

    2018-10-15 19:34:15
    GPU Gems 3.pdf 电子书, 英文原版,GPU开发必备书籍。
  • GPU Gems123 GPU 精粹中英文版全集chm下载...........
  • GPU Gems 2 中文版
  • GPU Gems 1 -3 GPU 精粹英文版本 ,GPU精粹1:实时图形编程的技术、技巧和技艺,[GPU精粹2.高性能图形芯片和通用计算机编程技巧],[GPU精粹3].(GPU.Gems.3)
  • GPU Gems 3 中文版
  • GPU Gems 2 pdf 电子书

    2018-10-12 17:12:02
    GPU Gems 2.pdf 电子书, 英文原版,GPU开发必备书籍。
  • Gpu Gems 3

    2012-05-24 10:43:00
    Gpu Gems 系列是NVIDIA公司出版的,NVIDIA作为全球一流GPU制造商,其撰写的书籍对一线研发人员具有很高的指导价值。.
  • GPU Gems 1 pdf 电子书

    2018-10-16 09:58:45
    GPU Gems 1.pdf 电子书, 英文原版,GPU开发必备书籍。 包含:英文CHM版、中文pdf版、英文扫描版
  • Gpu Gems》《Gpu Pro》《Gpu Zen》系列读书笔记

    万次阅读 多人点赞 2019-02-13 13:37:50
    本篇blog简单记录了一下最近一两年一直在读的一...《Gpu Gems》1-3三部,《Gpu Pro》1-7七部,《Gpu Zen》一部。针对每一项渲染技术,进行全系列书的总结,从这个角度来看,可以看到一项技术,近十五六年来的进化过程。

    前言

    最近赶上春节放假,然而家里的电脑不太给力,不敢玩什么大游戏,刚好看到《This War of Mine》打折,其实游戏大概在16年左右就玩过一次了,不过当时还是个穷学生(虽然现在依然穷,但是毕竟可以买得起游戏了),也没有很强的版权意识,这次决定补一下票。另一个很重要的原因在于经过几年时间,游戏竟然还在不断更新,新增了战争中的孩子等内容,并且更新了两个DLC。

    游戏主要是在战争中的人在一个简单的避难所中如何生存到战争结束,白天需要在避难所中建造,做饭,取水,加固避难所,与商人交易等等,夜晚时则需要到外面的废墟中搜索材料,食物,武器等。

    在玩基本篇时,基本没有任何剧情,但是当你为了生存下去,不得不去偷,抢一个废弃小房子中的老人的私人物品时,他追着你不停地祈求,即使知道他只是一个NPC。作为一个画面党,这个画面不怎么样的横版游戏当年给了我极其深刻的印象。而几年后这次重玩,我也差点玩脱,开始的几个人都在找东西的过程中被打死,最后只剩下一个人的时候,邻居把小孩子寄养在这里,靠着一个大人一个小孩艰难地玩到通关。

    此次DLC也是非常给力,讲述了两个非常感人的战争中的生存故事,分别是《最后的广播》和《父亲的承诺》。

    简介

    本篇blog简单记录了一下最近一两年一直在读的一系列书目。《Gpu Gems》1-3三部,《Gpu Pro》1-7七部,《Gpu Zen》一部。《Gpu Gems》三部是有中文版,而后面的几部都是英文原版。每一本中内容都是纷繁复杂,直接看其中的任何一本书可以说跳跃幅度极大,因为每一篇之间几乎没有联系。这一系列的总结浅墨大大已经在做了,给出了非常详细的单本书的关键内容提炼,从这个角度来看这一系列的书,个人认为是横向来说,每一部书都代表了当年最先进的图形学以及GPU相关的技术,可以看到当年GPU的能力,以及当年的渲染技术可以达到什么样的水平。

    小弟不才,决定使用纵向的方式,针对每一项渲染技术,进行全系列书的总结,从这个角度来看,可以看到一项技术,近十五六年来的进化过程。比如阴影效果,在《Gpu Gems》的年代,还有使用Shadow Volume的方式进行阴影的渲染,而在《Gpu Pro》系列开始,Shadow Map成为了绝对的主流,阴影技术的研究方向也转向了如何优化Shadow Map,如PCF,CSM,进而如何优化PCF,CSM,SSSM等等。

    本篇只是进行了一个技术的技术的简要总结,可能一句话或一小段话,甚至几个关键词。毕竟这一系列书,想要全看懂是不可能的,这辈子都不可能的,比如流体模拟等。还有一些与渲染关系较小的内容就更是一笔带过了,比如什么GPU通用计算《病毒特征匹配》等。不过,有些技术本人进行了实践,如AO体积光DecalReflection等等,但是也不能保证覆盖单项技术的全部实现。而后续的单项技术实践本人将陆续更新。

    《Gpu Gems》《Gpu Pro》《Gpu Zen》分类整理

    以下是各项技术的分类整理,除Multi Topic可能包含若干章节是很多技术整合分享的,其余绝大部分章节都是单向技术的总结。

    Multi Topic:

    《Gpu Pro1》Rendering Techniques in Call of Juarez: Bound in Blood:Deferred Shading,后处理流程,SSAO,Depth Fog,RainEffect。

    《Gpu Pro1》Making it Large, Beautiful, Fast, and Consistent: Lessons Learned Developing Just Cause 2:超多光源处理方式,Soft Shadow,Character Self Shadow,Soft Particle,Jitter Bug,精度连续等问题,Cloud Shading,若干渲染,内存优化项。

    《Gpu Pro3》CryENGINE 3: Three Years of Work in Review:CE3大量经验分享。移植到多平台的优化经验,只关注最影响性能的问题,不要做重复工作,如多个后处理相同的内容,多次Clear,分帧做一部分工作,但是需要注意负载均衡。一个字就是Share。一定做好性能预算,预算是不能超的,要让项目内所有人都明白这个底线问题。需要性能检测工具以及自动化测试性能的工具(超大规模团队300人工作室)。引擎使用Deferred Lighting,可以支持多种类型材质,HDR,Linear。后续各种CE3的技术,IBL,SSAO(SSDO,Bent Normal),Shadow(CSM,透明阴影),RLR(SSR),Deferred Decal,Deferred Skin,Screen Space Self Shadow,Soft Alpha Test,Post Processing(Camera & Object Motion Blur,Bokeh Dof)。

    《Gpu Pro6》Next-Generation Rendering in Thief:Cube Map,SSR,IBR等多项技术结合的反射系统构建;Contact-Hardening Shadows区域光源软阴影;支持光照的粒子效果;基于Compute Shader的Postprocessing。

     

    Rendering:

    《Gpu Gems1》Deferred Shading in S.T.A.L.K.E.R.:打开了延迟渲染世界的大门,利用DX9 MRT特性将着色和对象数量分离,并给出了后处理AA,多材质处理等。

    《Gpu Gems3》Deferred Shading in Tabula Rasa:对上一篇更深入地探讨了延迟渲染,最著名的延迟渲染分享之一,前向与延迟并存的流水线,多光源处理,双向光照模拟GI,Light Cookie,形状光源(盒式光照),全局及局部阴影图,GBuffer处理折射,边缘检测;优化方面,精度问题,模板掩码,动态分支,带宽及内存。

    《Gpu Pro1》Parallelized Light Pre-Pass Rendering with the Cell Broadband Engine:Deferred Shading带宽较高,文中使用Pre-Pass计算,利用PS3硬件的Cell Broadband Engine硬件SPE和RSX,将部分计算并行。

    《Gpu Pro4》Decoupled Deferred Shading on the GPU:主要是通过memoization cach,极力压缩计算量,以降低AA的消耗,使用对应DS无法MSAA的问题。stochastic rasterization。

    《Gpu Pro4》Tiled Forward Shading:对比了Forward,Deferred,Tiled Deferred的实现以及优缺点,实现了Tiled Forward Shading,先分Tiled,渲染Pre-Z Pass,每个Tiled寻找min,max Z Bounds,每个tile分配光源,Shading。可以支持半透,MSAA以及多类材质,但是又有Tiled Deferred的优点,最后扩展研究了一下Clustered Shading。

    《Gpu Pro4》Forward+: A Step Toward Film-Style Shading in Real Time:AMD的技术Demo,实现Forward+ Shading,Depth Prepass,Light Culling,Final Shading。通过DX11 Compute Shader实现分Tile的light Culling。将Forward+和基于Compute Shader的Tiled Deferred Shading对比。最后扩展One Bonce GI,2.5D Culling,超大量光源阴影计算等。

    《Gpu Pro5》[Mobile] Deferred Rendering Techniques on Mobile Devices:Deferred Shading:GLES3.0(带扩展的GLES2.0),深度float pack到RGBA,重建世界坐标。Pre-Pass Lighting(Deferred Lighting):存储光照信息而非GBuffer,降低带宽与内存。Light Indexed Rendering:存储光Id与影响像素的映射,相比于前两种,可以使用硬件AA。

    《Gpu Pro6》Real-Time Lighting via Light Linked List:常规Deferred Lighting需要深度,因而半透一般是通过后续的Forward Lighting实现,文中通过自定义Software Depth Test,影响当前屏幕像素点的Light Link List实现对半透对象的Deferred Lighting效果。

    《Gpu Pro7》Clustered Shading: Assigning Lights Using Conservative Rasterization in DirectX 12:使用Compute Shader以及DX12保守光栅化,实现优化的分簇渲染,三维空间划分光,存储到Light-Linklist中,降低光与物体映射的消耗。

    《Gpu Pro7》Fine Pruned Tiled Light Lists:一种优化的Tiled Shading,与传统的不同,通过两个pass,首先计算light在全屏的AABB进行粗略判断,然后逐Tiled精确判断,可以实现不规则光源的Tiled Shading,而且利用Compute Shader生成,再利用AMD的GCN架构上,将这个计算和ShadowMap并行,降低计算时间。用于《古墓丽影·崛起》。

    《Gpu Pro7》Deferred Attribute Interpolation Shading:传统GBuffer内存太高,以至于MSAA基本不敢开,文中给出了一种方法,不保存GBuffer信息,而是保存三角形信息,再通过插值进行计算,降低Deferred的内存消耗。还可以把GI等低频光照单独计算降低着色消耗。

    《Gpu Pro7》[Mobile] Physically Based Deferred Shading on Mobile:移动平台实现延迟物理渲染,利用Frame Buffer Fetch整合G-Buffer,Lighting,Tonemapping,降低带宽消耗。

    《Gpu Pro7》Deferred Coarse Pixel Shading:延迟渲染最后全屏着色pixel瓶颈较高,文中给出了一种生成Gbuffer时额外生成ddx,ddy然后通过Compute Shader对NxN大小块计算找到变化不明显区域,使用低频着色,即几个像素计算一次,该方式同样适用于后处理。

     

    GI:

    《Gpu Gems2》High-Quality Global Illumination Rendering Using Rasterization:通过两遍的方式,使用GPU来对光线和物体求交,得到很好的GI效果,极大加速了离线渲染,但是还不能实时运行。

    《Gpu Gems2》Global Illumination Using Progressive Refinement Radiosity:辐射度原理,逐步求精,半球投影可见性,四叉树细分,实现软阴影简介光照等效果。

    《Gpu Gems3》Interactive Cinematic Relighting with Global Illumination:GPU重光照引擎,用于电影级光照,对传统的GBuffer扩展,支持多次反射的间接照明。

    《Gpu Pro1》Fast, Stencil-Based Multiresolution Splatting for Indirect Illumination:VPL方式实现GI(光线反弹效果),使用ShadowMap可以精确实现但是不现实,通过Reflective Shadow Map近似模拟,但是有Fillrate的问题,文中给出了一种将需要计算的内容分成多个低分辨率的RT,通过Stencil优化,然后再upsample的方法。

    《Gpu Pro2》Real-Time One-Bounce Indirect Illumination and Shadows using Ray Tracing:结合RSM,再将场景切分成Gird,Ray Tracing模拟光源单次Bonce效果。

    《Gpu Pro2》Diffuse Global Illumination with Temporally Coherent Light Propagation Volumes:简要介绍RSM,结合RSM,Tracing实现可控性能的实时Diffuse GI,无Precompute。

    《Gpu Pro3》Real-Time Near-Field Global Illumination Based on a Voxel Model:通过将worldspace pos渲染到Texture,进一步构建voxel信息,通过mipmap chain实现Hierarchy Ray Tracing。RSM。支持One Onece GI。

    《Gpu Pro4》Progressive Screen-Space Multichannel Surface Voxelization:使用Voxel RayTracing实现GI效果,多帧之间步进的效果,相比于传统的GBuffer全屏信息的GI,可以实现不在屏幕内的物体的投射的GI效果。

    《Gpu Pro4》Rasterized Voxel-Based Dynamic Global Illumination:需要Depth Normal重建坐标和法线,另外DX 11 struct buffer,对场景多角度光栅化,存储到3D体素buffer中,最后结合VPL实现Bonce GI效果。

    《Gpu Pro6》Deferred Normalized Irradiance Probes:刺客信条4黑旗的GI技术,实现实时TOD,结合了实时和烘焙,仅sunlight影响GI,场景中摆放Probe,每3个小时的光计算GI,ShadowMap烘焙到一个CubeMap的每个面中,运行时插值计算,通过GPU烘焙极大降低了烘焙速度;World Ambient Occlusion。

    《Gpu Pro6》Real-Time Global Illumination Using Slices:通过将场景切分成格子,用对齐的2D图片对应,存储场景的光照信息,可以模拟单次的光Bounce效果,限制比较大。

    《Gpu Zen》Stable Indirect Illumination:通过deinterleaved texturing方式(棋盘格)优化Reflective Shadow Map,最终Cross Bilateral Filter,Upsample。单词Bonce GI效果。

     

    Lightmap:

    《Gpu Pro2》 Level-of-Detail and Streaming Optimized Irradiance Normal Mapping:常规Lightmap只能存储低频GI,但是高频的法线信息表现不出来,文中给出了一种将Lightmap作为输入,通过SH+Normal实现针对方向光的的更好的Lightmap效果。

     

    AO:

    《Gpu Gems1》Ambient Occlusion:AO正式在实时渲染中应用,基于离线光线追踪预计算,随机生成光线拒绝采样(Rejection Sampling),实时采样AO贴图。主要是计算某一点针对当前位置暴露的比例,仅适用于静态场景。

    《Gpu Gems2》Dynamic Ambient Occlusion and Indirect Lighting:动态实现AO,三角形计算被遮挡权重,多次计算图元ShadowMap迭代可以近似达到AO的效果,可以获得动态AO以及间接光照效果。

    《Gpu Gems3》High-Quality Ambient Occlusion:优化上篇的计算,对不连续出进行平滑,移除点尖,增加细节,使AO计算结果更加鲁棒,效果更好。

    《Gpu Pro1》Screen-Space Directional Occlusion:SSAO的改良版,正常SSAO只是压暗了颜色,没有考虑光的方向,造成整体一团黑。而SSDO可以在SSAO的基础上考虑光方向的影响,可以在Indirect Diffuse中看出光的方向感。

    《Gpu Pro2》Temporal Screen-Space Ambient Occlusion:TSSAO,Temporal技术,利用上一帧的Buffer,Reverse Reprojection,极大优化传统SSAO效率。

    《Gpu Pro3》Screen-Space Bent Cones: A Practical Approach:SSAO,Bent Normal的进一步加强版本,可以更加接近蒙特卡洛积分,重要性采样得到的GI Diffuse以及IBL效果,而不是单纯的压暗。

    《Gpu Zen》Scalable Adaptive SSAO:介绍了一套高中低配分级的AO系统,可以用于VR等。Deinterleaved rendering,Depth Mipmap Chain,Smart Blur。

    《Gpu Zen》 Robust Screen Space Ambient Occlusion:在PS4上优化到1080P1ms的SSAO。1/4分辨率,存储camera space depth然后downsample,可以用16位精度。分离Bilateral Filter(虽然这个是不可分离的,但是不太影响结果,性能大大提升),1/4算完后不直接合并,而是upsample以获得更好的效果。

     

    Shadow:

    《Gpu Gems1》Efficient Shadow Volume Rendering:阴影体方式实现阴影,模板阴影技术,效率较低,文中主要处理了一些模板阴影的特殊角度情况,以及优化填充率等。

    《Gpu Gems1》Shadow Map Antialiasing:优化的PCF采样,解决常规Shadow Map锯齿的问题,以及大分辨率解决不了的采样点平行于光源的问题,在采样时进行随机,计算靠近光源的百分比,多次比较阴影贴图的每个像素,求平均值,而非预Filter Shadow Map。

    《Gpu Gems1》Omnidirectional Shadow Mapping:将Shadow Map扩展到点光源中,使用Cube渲染点光源Shadowmap,以及软阴影PCF。

    《Gpu Gems1》Generating Soft Shadows Using Occlusion Interval Maps:遮挡区间映射制作模糊阴影(半影效果),在当时还没有什么好方法模拟,文中的方法也只适用于单光线的静态场景,而且有多重特殊情况失真,已经不太适用。

    《Gpu Gems1》Perspective Shadow Maps: Care and Feeding:PSM主要是为了解决SM锯齿的问题,根据投影近大远小的规则,优化近处锯齿,但是有若干问题,文中给出了优化版本的PSM方法,包括优化过的视锥体,CubeMap,Biasing,Filter等。

    《Gpu Gems2》Efficient Soft-Edged Shadows Using Pixel Shader Branching:用PCF实现软阴影的半影效果,蒙特卡洛方法随机采样。

    《Gpu Gems3》Summed-Area Variance Shadow Maps:对比了SM,PCF的优缺点,简要介绍了VSM的另一种软阴影实现,并且剔除了SVSM的方法,优化了常规的VSM,极大降低了Light Bleeding的情况。

    《Gpu Gems3》Parallel-Split Shadow Maps on Programmable GPUs:PSSM,在大型环境中实现SM,降低SM分辨率不足导致锯齿的问题。将视锥体分割成多个深度层,独立渲染SM。

    《Gpu Gems3》Efficient and Robust Shadow Volumes Using Hierarchical Occlusion Culling and Geometry Shaders:非常规的生成阴影几何体的方法,结合层次话的硬件遮挡查询以及Geomerty Shader实现了对传统Shadow Volumes方法的改进,提高性能。

    《Gpu Pro1》Visualize Your Shadow Map Techniques:Shadow Map都会有Aliasing的问题,文中给出了一个可以测量ShadowMap Aliasing Error的数学模型,可以量化Aliasing,方便对各类Shadow Map效果进行对比。

    《Gpu Pro1》Fast Conventional Shadow Filtering:通过将Filter操作拆分,可以将49次PCF降低到16次PCF。

    《Gpu Pro1》Hybrid Min/Max Plane-Based Shadow Maps:根据depth shadow划分小的tile,区分全部在阴影和全部在光内的内容,加快Shadow Map Filtering的方法。

    《Gpu Pro1》Shadow Mapping for Omnidirectional Light Using Tetrahedron Mapping:常规的点光源Shadow是Cube,文中给出了一种基于四面体的点光源ShadowMap方法。

    《Gpu Pro1》Screen Space Soft Shadows:屏幕空间阴影,通过深度计算像素距离,光源距离,然后屏幕空间Filter,降低Filter消耗。

    《Gpu Pro2》Variance Shadow Maps Light-Bleeding Reduction Tricks:VSM虽然比正常PCF省很多,但是有一个很致命的问题就是Light-Bleeding,文中给出了一种减缓这种穿帮的方法。

    《Gpu Pro2》Fast Soft Shadows via Adaptive Shadow Maps:扩展正常的PCF,使之支持在多级Shadowmap之间Filter。

    《Gpu Pro2》 Fast Soft Shadows with Temporal Coherence:常规软阴影都是通过Filter实现半影效果的,文中给出了一种真·软阴影效果,按照真实的原理模拟,随机采样光点位置混合,需要超大量的ShadowMap混合而成,但是性能堪忧,需要借助Temporal方法来优化,每帧渲染一个,多帧混合。

    《Gpu Pro2》Mipmapped Screen-Space Soft Shadows:屏幕空间软阴影的优化,借助多级Mipmap存储软阴影信息,两个通道,一个保存强度,一个保存屏幕空间半影宽度,使用半影权重在多级Mip之间index。

    《Gpu Pro3》Efficient Online Visibility for Shadow Maps:优化Shadow Map计算,尤其是大规模室外场景。检测Shadow Receivers,生成mask,渲染Shadow Caster时使用mask,去掉对最终Receiver无贡献的Caster计算。

    《Gpu Pro3》Depth Rejected Gobo Shadows:普通gobo Shadow的优化版本。一种Soft Shadow的实现方式,简单来说还是针对Shadowmap直接Blur,但是不适用于相交物体的Shadowmap。

    《Gpu Pro4》Real-Time Deep Shadow Maps:Deep Shadow Map之前是用于离线渲染时对于雾,头发等透明物体渲染的Shadow Map,文中给出一种基于实时的DSM方法,基于DX11 Compute Shader。

    《Gpu Pro6》Next-Generation Rendering in Thief:Contact-Hardening Shadows实现类似PCF的区域光源软阴影效果。

    《Gpu Pro6》Practical Screen-Space Soft Shadows:屏幕空间阴影,可以降低每个Light的PCF消耗,与ShadowMap分辨率解耦,文中为正常SSSS的优化,通过Layered Penumbra Map Pass实现多光源叠加下的软阴影,且支持透明物体。

    《Gpu Pro6》Tile-Based Omnidirectional Shadows:处理多点光源的ShadowMap,使用Tiled Based的Shadow Map,分为四层,最大8192(看到这个分辨率我都不想继续看了....)与传统的渲染到Cube不同,渲染到一个四面体上,使用Compute Shader实现一套Indirect Draw Buffer,通过GPU实现裁剪来降低大量点光源渲染ShadowMap的CPU消耗。

    《Gpu Pro6》Shadow Map Silhouette Revectorization:把MLAA的思想放到Shadow Map中,可以解决低分辨率的ShadowMap使用时出现的锯齿问题,但是目前解决不了投影和抖动造成的Aliasing。通过两个全屏pass解决,第一个pass查找shadowmap中不连续的边界;第二个pass根据不连续的距离以及位置,根据周围内容重建,使之更加平滑。

    《Gpu Pro7》[Mobile]Efficient Soft Shadows Based on Static Local Cubemap:Local Cubemap,可以较为精确地模拟贴合包围盒的反射,文中用Local Cube Map实现了烘焙到其中的软阴影效果,不过只支持Static预烘焙。

     

    Lighting:

    《Gpu Gems1》Cinematic Lighting:Pixar动画的光照模型,支持各种奇怪形状的光源,以及Cookie,主要是过光本身形成各种效果,不考虑纹理贴图,也不考虑细节,只是整体的光感。

    《Gpu Gems1》Spatial BRDFs:空间BRDF,光的表现除了细节贴图还有BRDF,文中给出了基本光源的BRDF以及基于Phong叶片Filter的环境贴图效果,通过不同mipmap级别存储不同镜面指数的Filter过的环境贴图,有些类似Roughness的前身了。

    《Gpu Gems2》Approximate Bidirectional Texture Functions:BTF,不考虑BRDF,使用非常简单的BRDF,而是基于摄影采集真是的特殊材质,在不同灯光角度下的值,生成查询贴图,来达到模拟如蜡,布料等特殊材质。新奇的思路.....

     

    Shape Light:

    《Gpu Pro5》Physically Based Area Lights : 可以反射显示光形状的区域光源,BRDF,Killzone

    《Gpu Zen》 Linear-Light Shading with Linearly Transformed Cosines:桶形或者线形光源的光照效果,精确的GGX BRDF模型,anisotropy matrix。

     

    PBR:

    《Gpu Pro6》Physically Based Light Probe Generation on GPU:FIFA15中间接光照的解决方案,通过Specular BRDF+Diffuse BRDF处理Indirect部分的光照,游戏加载时预烘焙场景中的LightProbe,场景CubMap存储不同模糊程度的环境到Mipmap中,优化过的重要性采样,可以根据光的分布进行采样,并保证每区域采样点平均分布。

     

    IBL:

    《Gpu Gems1》Image-Based Lighting:之前CubeMap最多就是模拟无限远处的反射效果,而文中通过IBL实现很好的室内金属光照反射效果,模拟近处的反射效果,给Cube定义了一个范围,类似后续的Box Project Cube Map,不过更加复杂。还可以用Cube模拟Difuse效果。

    《Gpu Gems2》Real-Time Computation of Dynamic Irradiance Environment Maps:辐照度环境映射,可以包含diffuse和specular映射信息,但是传统都是CPU离线处理,文中给出了GPU加速的卷积生成方法。

    《Gpu Gems3》GPU-Based Importance Sampling:引入蒙特卡洛方法,重要性采样,根据PDF生成更加真实的Pre-Filter Environment Map到各级mipmap中,而计算量可控,通过滤波去噪可以达到实时的效果。双抛物面环境贴图优化。

    《Gpu Pro1》Environment Mapping with Floyd-Steinberg Halftoning:Halftoning和重要性采样,对比了Random Sampling和Floyd-Steinberg Sampling,后者可以给出更加准确的效果。

     

    Linear & Gamma:

    《Gpu Gems3》The Importance of Being Linear:现实情况的显示设备,扫描图像等设备都有非线性的问题,Gamma校正是最容易的处理这个问题的方法,可以使光照计算的结果更加真实,防止失真,尤其是HDR下以及Mipmap纹理失真((1 + 0  ) / 2 在gamma下并非0.5),不同设备上的差异。输入图片未处理gamma,输出也未处理时,大体会抵消,但是会带来很多难以避免的问题。Gamma校正在最终显示前将显示器的变换取反以抵消显示器的Gamma校正,输入的图片已经经过Gamma校正,我们也需要将其转到线性空间,sRGB。

     

    NPR:

    《Gpu Gems2》Blueprint Rendering and "Sketchy Drawings":蓝图渲染和草图实现,后半部分介绍了勾边以及风格化渲染的效果。

    《Gpu Pro1》NPR Effects Using the Geometry Shader:传统卡通渲染勾线一般是加pass外拓或者后处理,文中给出了一种使用Geometry Shader直接生成边缘网格的方式单Pass实现NPR效果,此外还给出另一种铅笔素描风格的NPR渲染效果。

    《Gpu Zen》Mobile Toon Shading:卡通风格渲染,Ramp+Halftone,离线预处理。

     

    Volumetric Lighting,Fog,Atmospheric Scattering:

    《Gpu Gems2》Accurate Atmospheric Scattering:精确的大气散射效果,结算大气散射方程(Nishita),Rayleigh Scattering,Mie Scattering,最后增加HDR。

    《Gpu Gems3》Volumetric Light Scattering as a Post-Process:用径向模糊后处理实现体积光效果,Prepass处理遮挡。

    《Gpu Pro3》An Approximation to the Chapman Grazing-Incidence Function for Atmospheric Scattering:RayTracing,简化的Chapman function,模拟大气散射效果。

    《Gpu Pro5》High Performance Outdoor Light Scattering Using Epipolar Sampling:Ray Marching,epipolar sampling,1D minimum/maximum binary trees,Physically

    《Gpu Pro5》Volumetric Light Effects in Killzone: Shadow Fall : 体积光,Dithered Ray Marching,3D Noise Tex

    《Gpu Pro6》Volumetric Fog and Lighting:刺客信条4黑旗中的体积雾和体积光技术,理论还是比尔兰伯特定律和MieScatting,使用了Cumpute Shader计算,首先并行计算3D密度(噪声)图和雾效光照,再进行RayMarching,不同于KZ的Depth Ray Marching,直接在体素3DRayMarching,最后结果和Forward或Deferred的结合,Deferred可以和光照合并计算,还给出了down sample计算后up sample时aliasing的解决方案。

    《Gpu Pro6》Realistic Volumetric Explosions in Games:思想类似于Ray Marching体积光,Ray Marching方式实现爆炸效果,使用Tessellation,3DNoise Texture,可以实现光照。不过相比于普通粒子,GPUpixel阶段消耗太高。

    《Gpu Pro6》Sparse Procedural Volume Rendering:RayMarching体素实现爆炸浓烟等特效,使用层级的结构,降低Marching的消耗,使用CubeMap作为3DNoise。

    《Gpu Zen》Participating Media Using Extruded Light Volumes:NVIDIA提供的一套体积光解决方案,更加基于物理的体积光大气散射效果,需要Tessellation生成载体Mesh,然后Raymarching。

     

    Volumetirc Rendering:

    《Gpu Gems1》Volume Rendering Techniques:介绍了用排列观察面上的代理几何体实现基于纹理的体系渲染,并增加了阴影体,半透,随机细节等,优化了体渲染的效果。

    《Gpu Gems1》Applying Real-Time Shading to 3D Ultrasound Visualization:类似上篇文章,介绍了体渲染的实际应用,根据三维超声波可视化实现着色。

    《Gpu Pro1》Efficient Rendering of Highly Detailed Volumetric Scenes with GigaVoxels:Octree,Hierarchical Volume Ray Casting ,Voxel Mipmap,Mipmap based Blur,Dof,AA,优化体素内存Bandwidth。

    《Gpu Pro2》Adaptive Volumetric Shadow Maps:对于粒子,烟雾,头发等体渲染实现软阴影效果,需要per-pixel linked lists,然后Filter。

    《Gpu Pro3》Volumetric Transparency with Per-Pixel Fragment Lists:OIT,渲染烟雾,透明物体,Ray Tracing,Compute Shader,透明物体阴影。

    《Gpu Pro3》Practical Binary Surface and Solid Voxelization with Direct3D 11:体素渲染,可以扩展实现GI,AO等。

    《Gpu Pro6》Smooth Probabilistic Ambient Occlusion for Volume Rendering:体渲染中无法用深度图,通过3D Filter的方式实现AO效果,用多层嵌套的cube模拟计算遮蔽概率。

    《Gpu Pro6》Block-Wise Linear Binary Grids for Fast Ray-Casting Operations:使用二分区块方法,实现更加快速的体素碰撞计算,可以更容易地计算简介光照,VPL等内容。

     

    Distance Filed & Impostors & Curve:

    《Gpu Gems3》True Impostors:感觉类似体渲染,或者就是SDF,用光线投射到纹理定义的体积中,模拟各种复杂形状的对象。

    《Gpu Gems3》Rendering Vector Art on the GPU:在GPU上渲染矢量图,渲染二次样条,三次贝塞尔曲线等由封闭路径定义的向量图形,将曲线图形三角化的过程。

    《Gpu Gems3》Signed Distance Fields Using Single-Pass GPU Scan Conversion of Tetrahedra:介绍有向距离场的用途,GPU扫描实现有向距离场,极大加速生成。基于简单的四边形,伪法线处理符号。

    《Gpu Pro2》2D Distance Field Generation with the GPU:关注2D Distance Filed,主要是DF的生成,文中给出一种Horizontal-Vertical Erosion的方式实现更好的DF,最后介绍了几种DF的应用,更好的AA效果,OutLine效果,Psychedelic效果。

     

    Cloud:

    《Gpu Pro1》Real-Time Screen Space Cloud Lighting:给出了一种更加物理的云计算方法,基于屏幕空间,首先渲染一张云密度RT,进行Blur,再通过该RT计算Scattering,仅适用于远景云。

    《Gpu Pro 6》Real-Time Rendering of Physically Based Clouds Using Precomputed Scattering通过预计算的RayMarching得到根据视深度的光散射效果,模拟光线穿透云的效果;Gpu粒子排序,Instancing,特殊的Blend方式-Volume-Aware Blending。

    《Gpu Pro7》Real-Time Volumetric Cloudscapes:《地平线·黎明时分》的云渲染技术,类似当年他们KZ的体积光,依然是Ray Marching,但是给出了更加复杂的云层光照计算,以及天空不同高度云层表示,可以通过噪声密度控制疏密,乌云等,通过参数可以实现云彩的TOD,资源占用20M,RayMarching20ms,Temporal reprojection优化后2ms。

     

    Translucent & SSS:

    《Gpu Gems1》Real-Time Approximations to Subsurface Scattering:几种SSS表现,最简单的WrapLighting,通过深度图计算传输距离吸收效果模拟Translucent,原理类似Shadowmap,Texture Space Diffusion  Blur模拟美术经常Blur Diffuse贴图叠加得到柔和的光照效果,最后一种也是Texture Space Skin SSS的做法。

    《Gpu Gems3》High-Quality Ambient Occlusion:AO的方法,自适应整合计算环境遮挡,但是也可以实现SSS效果。

    《Gpu Pro2》Real-Time Approximation of Light Transport in Translucent Homogenous Media:简单模拟光线透射,通过反向烘焙AO实现,也可以实时计算厚度图。

     

    Skin:

    《Gpu Gems1》Skin in the "Dawn" Demo:Dawn中的皮肤效果,Cube实现Diffuse,Specular,Environment光照,RimLighting,细节法线贴图表现毛孔等。

    《Gpu Gems3》Advanced Techniques for Realistic Real-Time Skin Rendering:实时皮肤渲染的最经典文章,后续Skin的基础。Scattering,Diffusion Profile,分离高斯模糊,Textur Space Diffusion,使用TSM实现皮肤等透射。

    《Gpu Pro1》Screen-Space Subsurface Scattering:Diffusion Profile改为屏幕空间,有诸如可以避免overdraw,降低空间转化次数,多个皮肤一次搞定等好处。需要结合Linear Depth的Blur,此外还有Stencil Mask。

    《Gpu Pro2》Pre-Integrated Skin Shading:预积分的皮肤效果,NdotL以及斜率分别采样预计算的Ramp图,可以很省地实现SSS效果。

    《Gpu Pro5》[Mobile] Realistic Real-Time Skin Rendering on Mobile: 移动平台皮肤渲染,Screen Space Diffusion,N·H,N·V Lut Texture

     

    Grass & Plant:

    《Gpu Gems1》Rendering Countless Blades of Waving Grass:俯视图星形结构的网格渲染,防止由视角变化造成的穿插,禁用背面剔除。根据texcoord控制摇摆权重。

    《Gpu Gems2》Toward Photorealism in Virtual Botany:大规模植被户外场景渲染,栅格种植植被,草合批渲染,Screen Door Transparent渲染半透,分层渲染,配合后处理等达到较好的户外渲染效果。

    《Gpu Gems3》Next-Generation SpeedTree Rendering:树干粗糙凹凸使用Relief Mapping自动生成,树叶双面光照,远距离Specular降低,模糊Bump降低闪烁,树叶阴影,Alpha To Coverage,LOD渐变。

    《Gpu Gems3》GPU-Generated Procedural Wind Animations for Trees:程序化生成风场,模拟树木在凤中的运动,树干,树枝运动模拟。

    《Gpu Gems3》Vegetation Procedural Animation and Shading in Crysis:CE2中植被的技术(CE3看起来也没改啥),程序模拟风场,实现树木运动的效果,通过顶点色控制,sin波叠加。此外,还通过植被的细节纹理图(类似AO,或者就叫透明图吧)实现叶片Transclut效果。此外还有HDR,基于Z Press的而非Alpha to Coverage的软Alpha Test效果。

    《Gpu Pro5》Screen-Space Grass : 屏幕空间计算草地效果,看起来不错,主要解决草Instancing也太费的问题,Stencil Mask

    《Gpu Pro6》Grass Rendering and Simulation with LOD:纯GPU草效果,TressFX的后续扩展功能,使用Instance对不同形状的草进行绘制,在Shader中扩展billboard片,Compute Shader进行草半透片的距离排序,支持距离LOD。

     

    Fur:

    《Gpu Gems1》Converting Production RenderMan Shaders to Real-Time:将RenderMan离线渲染的毛发移到Shader中,一方面是离线到cg的API实现,如给出了多光源多Pass计算多光源的方式以应对不确定的光源数(Shader不定长数组支持不好),另一方面则是通过Lut,Pixel->Vertex->CPU转移优化等方式进行渲染效率的优化。

    《Gpu Pro2》Implementing Fur Using Deferred Shading:正常GBuffer无法实现多pass blend叠加的毛发,文中给了一种Deferred Shading情况下实现毛渲染。

    《Gpu Pro6》[Mobile] Animated Characters with Shell Fur for Mobile Devices:当时移动上无法使用Tessellation,所以使用Transform Feedback动画+Instancing的方式,将原本多DC叠加的绘制毛绒的方式优化为Instancing的方式,极大优化了效率。

     

    Hair:

    《Gpu Gems2》Hair Animation and Rendering in the Nalu Demo:Nalu中头发效果,鱼鳍的效果,头发物理效果,以及Marschner模型实现光照,头发阴影不透明阴影图。

    《Gpu Pro5》TressFX: Advanced Real-Time Hair Rendering:海飞丝系统,线形图元扩展渲染,Kajiya+Marschner,Self-Shadowing,Image Based AA,Order Independent Transparency

    《Gpu Pro5》 Hair Simulation in TressFX:海飞丝系统,使用DX11 Compute Shader实现对头发的模拟,整体形状,发丝模拟,风影响,碰撞等。

     

    Transparent:

    《Gpu Gems2》Blueprint Rendering and "Sketchy Drawings":蓝图渲染和草图绘制,前半部分展现了蓝图中透视的边框线通过Depth Peeling实现。

    《Gpu Pro1》Alpha Blending as a Post-Process:一般Alpha Test边界太硬,Alpha To Coverage效果好一些,不过Alpha Blend效果最好,比较柔和,但是有半透穿插以及性能问题,文中给出了一种将Alpha Test物体先渲染到RT上,渲染遮挡Mask以及Coverage融合Mask,最终叠加回去的方法,可以用Test得到Blend的效果。

    《Gpu Pro1》Multi-Fragment Effects on the GPU Using Bucket Sort:半透渲染,通过MRT在GPU实现透明物体的排序,Depth Peeling。

    《Gpu Pro2》Order-Independent Transparency using Per-Pixel Linked Lists:类似ABuffer实现OIT,结合DX11新特性 随机读写可以更容易实现。通过GPU构建Pixel Link list。最后,支持MSAA,并给出了若干优化方法。

    《Gpu Pro 5》Per-Pixel Lists for Single Pass A-Buffer : ABuffer,GPU 链表,排序

    《Gpu Pro 5》[Mobile] Tiled Deferred Blending:Tile Bucketing降低混合操作的带宽,降低时间,不过在Iphoe4S上时间似乎是负优化

     

    Reflection:

    《Gpu Gems3》Robust Multiple Specular Reflections and Refractions:鲁棒的多镜面反射和折射,可以实现多反射,先将场景渲染为层次化的距离图,每个层存储为一个Cube Map,包含了颜色以及距离,法线。然后通过对这种结构进行光线追踪实现反射和折射效果。

    《Gpu Pro3》Ray-Traced Approximate Reflections Using a Grid of Oriented Splats:通过生成一系列3D的Grid 64^3,进行RayTracing,可以模拟简单的模糊反射效果。

    《Gpu Pro4》Practical Planar Reflections Using Cubemaps and Image Proxies:《Remember Me》的反射系统构建,Parallax-Correct Cube Map实现精确一些的Cube Map反射,使用Image Proxy实现动态物体的反射,Mipmap Chain Blur Reflection实现Glossy Reflection。

    《Gpu Pro5》Hi-Z Screen-Space Cone-Traced ReflectionsRay Marching,Hi-Z,Con Tracing,Blur Reflection,SSR Overview,Temporal Filtering

    《Gpu Pro6》Next-Generation Rendering in Thief:Cube Map,SSR,IBR结合的反射系统,支持Glossy Reflection,Bump。给出了许多SSR和IBR的优化方案。最终Consonle上5ms。

     

    Refraction:

    《Gpu Gems2》 Generic Refraction Simulation:不渲染两次,而是直接把原始场景渲染到RT上,采样RT进行折射模拟。但是可能有前面的遮挡导致折射物体前的物体也被扰动,所以渲染时生成一个Mask,避免扰动前面的物体。

     

    Water:

    《Gpu Gems1》Effective Water Simulation from Physical Models:网格模拟集合波动,网格扰动,Gerstner波,顶点间距小于1/2波长。水面自身颜色,反射颜色,菲尼尔控制透明度,浅水区透明,深水区不透。

    《Gpu Gems1》Rendering Water Caustics:水的焦散效果,水面波纹导致不同路径的光线浸入水中到达相同区域汇聚形成亮斑,使用逆向光线追踪,从海底法线光线,到水面折射,如果到达光源,认为高亮。两种方式,一种屏幕空间,一种渲染到纹理。

    《Gpu Gems2》Using Vertex Texture Displacement for Realistic Water Rendering:当时FFT还不敢想,所以文中根据采样贴图实现顶点偏移,但是基于法线贴图计算光照,用法线贴图当做高度图。分支优化,泡沫渲染,波浪背面处理

    《Gpu Pro2》[Mobile] Shader-Based Water Effects:移动平台上ES2.0下实现水效果,平面反射,折射,Bump扰动,Fresnel,Fog。

    《Gpu Pro3》Volumetric Real-Time Water and Foam Rendering:类似流体,粒子模拟,带物理。模拟水面泡沫效果,瀑布激水,水花等。需要前后深度,模拟体效果。

     

    Decal:

    《Gpu Pro2》Volume Decals:延迟贴花实现,延迟下性价比超高,没有前向下的各种性能问题以及Z Fighitng问题。

     

    Image(Post) Processing:

    《Gpu Gems1》Real-Time Glow:最基本的Glow效果,提取高亮,横向纵向分离卷积叠加回原图。此外为了防止抖动,调高了远处的雾效,还有结合上一帧形成拖影效果。

    《Gpu Gems1》Color Controls:后期效果,模拟PhotoShop中各种颜色处理效果,根据曲线生成LUT图校色图像,根据Channel进行颜色校正,以及在不同颜色空间进行转换等。

    《Gpu Gems1》High-Quality Filtering:开始在GPU实现高质量的图像滤波处理,介绍了卷积核,灰度处理,边缘检测,AA等方法。

    《Gpu Gems1》A Framework for Image Processing:一套后处理流程搭建,支持多个后处理效果。

    《Gpu Gems2》Using Lookup Tables to Accelerate Color Transformations:简单介绍了一下LUT,但是常规LUT满足不了输入输出,引入了三维LUT,分辨率32*32*32,不能过大,实现对某些操作预计算,某些操作可以提高100倍的效率。

    《Gpu Gems2》Advanced High-Quality Filtering:GPU实现模糊,重建,锐化(Shock Filtering),抗锯齿等滤镜。

    《Gpu Gems3》Motion Blur as a Post-Processing Effect:运动模糊效果,上一帧的VP矩阵重建世界坐标,与当帧重建的世界坐标比较,叠加得到运动模糊效果。适用于相机本身移动的情况。

    《Gpu Pro1》Anisotropic Kuwahara Filtering on the GPU:Gpu实现Kuwahara滤波效果,可以过滤高频噪声,保留低频,而且带有各向异性效果,可以加强画面的方向感,形成类似油画或者水彩的感觉。

    《Gpu Pro1》GPU Color Quantization:通过将Self-Organizing Map在GPU上进行处理,极大加快了色彩量化处理

    《Gpu Pro1》Stylized Rendering in Spore:后处理链的流程的搭建,包括Distort,Blur,Old Film,Oil Paint等等。

    《Gpu Pro1》Parallelized Implementation of Universal Visual Computer:将滤波处理Halftone,Edge Detect等从CPU转移到GPU上。

    《Gpu Pro2》[Mobile]Post-Processing Effects on Mobile Devices:移动平台若干后处理实现,Bloom,Blur,Dof。

    《Gpu Pro4》Coherence-Enhancing Filtering on the GPU:一系列Filter实现平滑实现Flow-Guided Sommth,实现很好的平滑效果,有点风格化油画的效果。

    《Gpu Zen》High Quality GPU-efficient Image Detail Manipulation:细节处理滤镜,增加或者移除细节,通过GL Compute Shader实现。

     

    Dof:

    《Gpu Gems1》 Depth of Field: A Survey of Techniques:首先介绍了景深的原理,以及列举了若干景深的方法,光线追踪,累积Buffer,分层绘制,基于深度混合的。最后重点介绍了一些基于深度混合CoC的方法,多级mip混合,双线性插值。

    《Gpu Gems3》Practical Post-Process Depth of Field:还是跟上篇一样,过了一遍常规的实现方式,然后重点解释了一下景深的原理(物理原因),然后优化了模糊的实现,使之可以用很少的采样次数达到较好的效果。可变宽度模糊,散光圈半径。

    《Gpu Pro1》Realistic Depth of Field in Postproduction:使用更加物理的参数表达镜头的景深效果,使用CUDA进行模拟计算,并给出了优化模糊和清晰边界的方法。

    《Gpu Pro4》 The Skylanders SWAP Force Depth-of-Field Shader:两种一种基于物理的CoC,一种更方面美术的远近模糊配置。使用根据距离进行对非聚焦位置Blur。

    《Gpu Pro4》Simulating Partial Occlusion in Post-Processing Depth-ofField Methods:使用OIT思想实现DOF,存储不同深层级的场景到ABuffer,使用多层级可以得到焦点外更加真实的模糊效果。

    《Gpu Pro5》Bokeh Effects on the SPU : 散景,SPU,CoC,Sprite-Based Approach

    《Gpu Zen》Practical Gather-based Bokeh Depth of Field:1.5ms 1080p GTX660,COC模糊,光圈边界模糊效果,1/4分辨率计算,最后特殊Upsample。

     

    AA:

    《Gpu Gems2》High-Quality Antialiased Rasterization:一种将屏幕分块SSAA,然后拼合的技术。屏幕分Tile,调整投影矩阵渲染到超大分辨率上,然后降采样。用于离线渲染超清晰图像。

    《Gpu Gems2》Fast Prefiltered Lines:介绍了一种绘制线条的方法,线条容易有锯齿,文中给出了一种卷积,并且通过查找表进行加速,得到抗锯齿线条。

    《Gpu Pro1》Edge Anti-aliasing by Post-Processing:Deferred下,MSAA带宽和内存消耗太高,文中给出一种基于Depth和Normal进行后处理搜寻倾斜边缘,复制边缘细微像素融合的后处理AA方式,抗锯齿效果堪比MSAA,还可以用于ShadowMap,以及应对UpSample。

    《Gpu Pro2》Practical Morphological Antialiasing:对比了当时各种已有的AA算法,然后提出了一种新的AA后处理方法,性能和效果都比较好。Edge Texture,Blending Weight Texture。

    《Gpu Pro3》 Geometric Antialiasing Methods:给出了两种基于Geomerty的AA方法。GPAA,需要将所有物体的边缘再渲染一次到RT上,然后在Blend回去。GBAA是其优化,渲染时额外生成一个Geomerty Buffer存储边缘信息,MRT,节省DC。

    《Gpu Pro3》[Mobile] Inexpensive Antialiasing of Simple Objects:用于移动平台的一种简单AA方式,简单来说就是在画一遍更加平滑的边盖住原始的锯齿。

    《Gpu Pro3》Implementing a Directionally Adaptive Edge AA Filter using DirectX 11:DX10,11上实现一种更好的Box antialiasing filter,基于后处理的。主要是计算更加精确的倾斜边界线来表示边缘,非常数学...没有看懂。

    《Gpu Pro4》Second-Depth Antialiasing:通过Pre-Z Pass的Depth Buffer和额外的一个Depth Buffer实现更加青雀的基于Geomerty Eddge的AA方法。

    《Gpu Pro5》Wire Antialiasing:光栅化后小于一个像素的MSAA也只能缓解,解决电线等特别细的物体渲染时的AA,可以配合MSAA使用。

    《Gpu Pro6》Hybrid Reconstruction Antialiasing:整套AA处理框架用于Far Cry4,包含各种AA。HRAA,对比了SSAA,MSAA,GBAA,最后提出了Temporal FLIPQUAD AA。

    《Gpu Zen》Programmable Per-pixel Sample Placement with Conservative Rasterizer:利用保守光栅化的特性,通过Geomerty Shader调整采样位置,使Aliasing变成高频噪声,进而可以被滤波去掉,并介绍了怎样整合到Foveated Rendering系统。

     

    Ray Tracing:

    《Gpu Pro1》Real-Time Multi-Bounce Ray-Tracing with Geometry Impostors:实时光追,除了Heightmap精确表示物体的形状信息外,还要有粗略的物体光线检测,另外需要保证动静分离,降低每帧更新对象数量,cubemap sistance Impostors。

    《Gpu Pro3》Interactive Ray Tracing Using the Compute Shader in DirectX 11:DX11 Compute Shader实现 Ray Tracing效果,Bounding Volume Hierarchies优化,Shading,Reflection,GI等。

    《Gpu Pro4》Bit-Trail Traversal for Stackless LBVH on DirectCompute:上文的后续,主要讲了LBVH的在GPU的构建,以加速Tracing。

    《Gpu Pro5》Particle-Based Simulation of Material Aging : 材质做旧,生锈效果,Ray Tracing

    《Gpu Pro5》 Object-Order Ray Tracing for Fully Dynamic Scenes:结合当前的光栅化渲染使用光线追踪渲染,支持动态场景,通过目前标准的光栅化渲染的资源生成体素化的场景结构,优化光线碰撞,多Pass渲染得到当前最近点信息,最后再使用deferred 实现着色。

    《Gpu Pro6》Rendering Vector Displacement-Mapped Surfaces in a GPU Ray Tracer:OpenCL Ray Tracing实现Displacement Map。

    《Gpu Pro6》[Mobile] Hybrid Ray Tracing on a PowerVR GPU:使用专门的OpenRL库,通过G-Buffer的中间信息进行计算,结合光栅化实现光线追踪渲染效果,方便实现软阴影,反射,折射等在直接光栅化中比较复杂的效果。

    《Gpu Pro7》 Semi-static Load Balancing for Low-Latency Ray Tracing on Heterogeneous Multiple GPUs:GPU 光线追踪,针对不同GPU如果有不同的运算能力,进行合理分配以最大化效率,同样的思想也可以用于CPU。

     

    Occlusion Culling & GPU Pipeline:

    《Gpu Gems1》Efficient Occlusion Culling:虽然不算GPU Pipeline,但是至少算是开始往这方面研究的始祖之一了。通过渲染物体之前先绘制简单包围盒判断可以光栅化像素数量判断是否可以提出,与Early-Z是两个概念,可以更进一步提出,发生在真正渲染的流水线之前。

    《Gpu Gems2》Hardware Occlusion Queries Made Useful:常规的硬件遮挡查询性价比不高,主要有额外绘制以及需要等待GPU查询结果,延迟高。文中给出了一种优化方案,构建场景树状结构,从前到后处理节点,渲染时交叉进行遮挡,并且溅射先前帧可见的物体当帧仍然可见,节省了查询时间。

    《Gpu Pro1》Hierarchical Item Buffers for Granular Occlusion Culling:不涉及CPU feedback的问题,仅考虑GPU上遮挡的问题,实现了一种仅在GPU上的遮挡方法,还可以针对管线早期,如Gemoerty进行优化。

    《Gpu Pro2》Practical, Dynamic Visibility for Games:GPU Occlusion,通过Hi-Z,将对象存储到vertex buffer中,通过shader计算碰撞遮挡,然后RT Readback实现GPU剔除。

    《Gpu Pro4》Introducing the Programmable Vertex Pulling Rendering Pipeline:CPU瓶颈,对比了一下DC中的各类消耗,CPU,GPU等,根据Draw ID区分内容。

    《Gpu Pro5》 Quadtrees on the GPU:完全在Gpu实现Recursive的Quadtrees,方便脱离CPU实现地形LOD等功能。

    《Gpu Pro6》Compute-Based Tiled Culling:使用Cumpute Shader对分Tiled的区域进行光源影响计算,通过GPU上计算降低原本在CPU上计算的光源物体映射,并介绍了若干优化。

    《Gpu Zen》Rendering Convex Occluders with Inner Conservative Rasterization:保守光栅化实现更加精确的凸包体遮挡剔除效果。

    《Gpu Zen》Deferred+: Next-Gen Culling and Rendering for the Dawn Engine:《杀出重围》引擎研究的新技术,并未正式使用。GPU Pipeline,前一阵1/4Depth Buffer Reproject,GPU Instacing渲染所有OBB,保守光栅化优化判断,实现多种材质Deferred Shading,Deferred+,Compute Shader。

    《Gpu Zen》Optimizing the Graphics Pipeline with Compute:在AMD上通过Compute Shader实现各种Culling(Cluster,Small Primitive,Backface,Frustum,Depth),Tesselation,以及AMD GCN架构下的某些特性优化。

     

    Special Effect:

    《Gpu Gems1》Simulating Diffraction:衍射的模拟,光盘等各向异性的效果模拟,tangent方向计算各向异性,额外附加彩虹贴图模拟色散。

    《Gpu Pro2》[Mobile] A Shader-Based eBook Renderer:在GLES2.0上实现电子书的翻页动画效果,并给出了ES1.1上fallback。

    《Gpu Pro4》A Pipeline for Authored Structural Damage:制作角色部分破坏效果,比较了几种常见做法,分块做模型,SkinMesh做动画,Alpha Test等方法,而最后给出了使用顶点色作为标识,直接在Vertex Shader阶段实现剔除的方案,性能和效果都比较好。

     

    Particle:

    《Gpu Gems1》 Fire in the "Vulcan" Demo:火焰粒子效果,排序的Alpha Blend Billboard贴片,降低Fillrate先把其渲染到低分辨率的RT再叠加回来,遮挡关系通过渲染低模到RT上实现。

    《Gpu Gems3》High-Speed, Off-Screen Particles:与上一篇思想类似都是为了降低大量overdraw消耗,先把粒子渲染到低分辨率RT再叠加回来,但是处理得更加全面,结合硬件新特性。离屏的Buffer不需要再渲染低模,而是直接使用主buffer的深度进行down sample的结果,需要DX10支持;软粒子相关;手动Blend,混合时upsample效果不好,需要进行边缘检测优化。

    《Gpu Pro6》[Mobile]Implementing a GPU-Only Particle-Collision System with ASTC 3D Textures and OpenGL ES 3.0:使用GLES3.0的新特性,Transform Feedback在vertex中模拟粒子然后写回vertex buffer再渲染,并且使用Instancing降低大规模粒子的消耗。

    《Gpu Pro7》Interactive Cinematic Particles:使用DCC Tools离线生成粒子,然后压缩,最后再使用引擎实时渲染,可以模拟更加真实的粒子。

     

    Optimizing:

    《Gpu Gems1》Graphics Pipeline Performance:流水线各个阶段的优化技巧,CPU提交,合批,Shader分支,采样,Vertex,Fragment都有介绍

    《Gpu Gems2》Optimizing Resource Management with Multistreaming:DX8下实现优化顶点流的功能,自动管理顶点数据,剔除无用定点数据提交进行优化。

    《Gpu Gems2》GPU Program Optimization:介绍了若干GPU优化的策略,如多数据pack成一个vector并行计算,lut查找表等。

    《Gpu Pro2》Shader Amortization using Pixel Quad Message Passing:利用GPU光栅化的一个特性,也是ddx,ddy以及Mip的原理,周围像素一起光栅化,借助这个思想可以优化部分计算,如PCF等,还需要UpSample,不过这个技术有部分硬件限制,DX11后会好。

    《Gpu Pro3》Z^3 Culling:为了防止Alpha Test或者Discard等导致Early-Z失效,文中给了一种自己采样深度的实现culling的操作,也可以实现overdraw的优化。

    《Gpu Pro5》[Mobile] Bandwidth Efficient Graphics with ARM® Mali™ GPUs:Shader Framebuffer Fetch Extensions,Shader Pixel Local Storage,使用扩展可以直接读写当前缓存,而非整个frame buffer,直接读取深度,极大降低带宽消耗。

    《Gpu Pro7》Progressive Rendering Using Multi-frame Sampling:正常渲染比较费,那么就把渲染分摊到多帧,使用一个积累的结果,该思想可用于AA,DOF,SSAO,OIT。

     

    Instancing & Batching:

    《Gpu Gems2》Inside Geometry Instancing:通过Geomerty Batch的方式实现尽可能降低批次的渲染,四种方式,静态合批,动态合批,Vertex Constants Instancing(固定内容不变,每帧写顶点数据控制变化),Instancing API(DX9已经给了类似Instancing的API,不过似乎和现有Instancing有些区别),各有优缺点。

    《Gpu Gems2》Segment Buffering:还是英规场景中重复物体,将靠近的物体合并成一个大的实例,降低渲染批次。

     

    Crowds:

    《Gpu Gems3》Animated Crowd Rendering:DX10直接支持更好的Instancing,直接通过Instancing大量绘制对象。然后使用纹理存储动画,vertex阶段读取,实现大规模Instancing动画。LOD。

    《Gpu Pro2》Rendering Pipeline for Real-Time Crowds:Transform Feedback,Geomerrty Shader,RT,Instancing在GPU上实现多级LOD以及视锥体裁剪,超大规模人群渲染,8192级别。

    《Gpu Pro3》Optimized Stadium Crowd Rendering:观众席大规模渲染,先根据方向视角,动作把模型渲染到RT上作为模板,albedo,normal,以及一些特殊信息,然后通过Instancing大规模渲染Billboard贴片,再通过Deferred Shading降低Overdraw。

    《Gpu Zen》Real Time Markov Decision Processes for Crowd Simulation:主要关注的是马尔科夫决策,模拟行为,顺带包含了一些超大规模人物角色渲染的内容,GPU剔除等。


    Animation & Morph:

    《Gpu Gems1》Animation in the "Dawn" Demo:Dawn中的动画模拟,第一种是Morph,多套网格之间插值计算模拟细腻的动画,还有蒙皮骨骼动画。

    《Gpu Gems1》Deformers:通过输入控制参数控制网格变形,如弯曲,膨胀,裁剪,扭曲等,在GPU上实现形变,最关键的问题在于顶点变化后,法线如何变化,Jacobian矩阵。

    《Gpu Gems3》DirectX 10 Blend Shapes: Breaking the Limits:DX10下使用更强的顶点流输出(Transform Feedback?)实现Morph结果输出,再迭代处理,无需一次融合所有Morph,打破了可以Morph的数量限制,实现任意多Morph融合。

    《Gpu Pro5》[Mobile] Efficient Morph Target Animation Using OpenGL ES 3.0:通过Transform-feedback技术,在正常渲染之前通过一个prepass处理morph,实现Morph动画效果。

     

    Texture Animation:

    《Gpu Pro2》 Practical and Realistic Facial Wrinkles Animation:使用法线贴图,Mask图等实现人物的皱纹动画效果。

     

    Bump & Parallex Mapping & Displacement Maping & Relief Mapping:

    《Gpu Gems1》Leveraging High-Quality Software Rendering Effects in Real-Time Applications:主要介绍了将离线渲染的高模的一些信息存储到贴图中,然后实时渲染时使用,一方面是法线高模烘焙到低模,另一方面也包含了一些光照信息。

    《Gpu Gems2》Adaptive Tessellation of Subdivision Surfaces with Displacement Mapping:Tessllation曲面细分的情况下结合Displacement Mapping。

    《Gpu Gems2》Per-Pixel Displacement Mapping with Distance Functions:按照Ray-Tracing的方式进行表面处理,可以达到比Parallex Map等技术更进一步的表面凹凸效果。

    《Gpu Gems3》Relaxed Cone Stepping for Relief Mapping:用于浮雕映射的松散式锥形步进,基本的Relief Mapping到进一步扩展,如二分查找,锥形步进等,最后给出了松散式锥形步进的方法,消除了锥形步进半径定义的限制,space-leaping结合二分查找。

    《Gpu Gems3》Baking Normal Maps on the GPU:将一个十分重要的功能,高模烘焙法线贴图从原本的CPU移植到GPU上的过程,还有一些SM3.0的限制,以及内存,走样问题处理,此外还可以用于Parallax mapping和relief mapping,ao map,cavity map等,简单来说就是GPU烘焙的实现,极大优化了工作流。

    《Gpu Pro1》Quadtree Displacement Mapping with Height Blending:常规法线贴图以及视差贴图都有较大的限制,视角,自阴影,AO等问题,通过Ray-Tracing的原理实现的Displacement可以满足上述条件,可以任意高度扩展网格,文中还给出了预计算存储在Mip中的Quadtree加速Tracing优化的方案。

     

    Texture Format & Compression:

    《Gpu Gems1》The OpenEXR Image File Format:主要是HDR格式的贴图,LDR保存不了高亮信息会被Clip掉。半精度。给出格式结构,使用等。

    《Gpu Pro4》Real-Time Ptex and Vector Displacement:主要是将原本分散的uv压缩整合得很紧密,能很大程度地利用贴图,尤其是对于Tesslection的Displacement map。

    《Gpu Pro4》Practical Framebuffer Compression:压缩HDR FrameBuffer降低内存带宽消耗,支持直接在上面计算以及Blend等。通过将RGB改变成YCoCg颜色空间,使用两个通道就可以表示图像。

    《Gpu Pro4》Real-Time JPEG Compression Using DirectCompute:实时GPU实现JPEG图片压缩,使用Direct Comulte,使实时压缩成为可能,可以为视频等进行压缩。

    《Gpu Pro5》[Mobile] Adaptive Scalable Texture Compression:ASTC压缩格式,Channel Weight,Block Weight可以单独设置,可以以一个选定的比特率来压缩常见的任意贴图格式的贴图,甚至3D贴图。

    《Gpu Pro5》 Reducing Texture Memory Usage by 2-Channel Color Encoding :两通道表示颜色,特殊色彩空间压缩颜色贴图

    《Gpu Pro7》Real-Time BC6H Compression on GPU:BC6H方式纹理压缩,主要是针对HDR格式的贴图,一般用于CubeMap的压缩,该方法可以用于实时压缩,基于GPU,256*256*6全套mipmap chain的0.07ms。

     

    HDR:

    《Gpu Pro6》[Mobile] High Dynamic Range Computational Photography on Mobile GPUs:结合OpenGL和OpenCL实现了一套通过GPU处理照片曝光问题的流程,通过多曝光系数的照片结合+Tone-Mapping生成最终图片。

     

    Texture Filter & Sample & Mipmap: 

    《Gpu Gems1》Fast Filter-Width Estimates with Texture Maps:主要是ddx,ddy求导在某些硬件不支持,而借助mipmap实际上跟ddx,ddy原理近似,利用将内容存储到mipmap中达到使用ddx,ddy的方法。

    《Gpu Gems2》Tile-Based Texture Mapping:贴图太大,将内容重复的贴图改为小块,增加一个st,也就是Tilling功能,不过需要处理mipmap的问题。可以大幅度降低贴图量。

    《Gpu Gems2》Fast Third-Order Texture Filtering:介绍了一种能减少高阶纹理过滤需要采样次数的方法。对三阶过滤器曲线过滤进行优化。

    《Gpu Gems2》Mipmap-Level Measurement:由于GPU决定用哪一级mip因素较多,不好CPU模拟,所以文中给出了一种直接使用GPU结果的方法,false colored(伪着色),将可见的mip层载入,而无需全部载入,大幅度降低内存消耗。

    《Gpu Gems2》Deferred Filtering: Rendering from Difficult Data Formats:延迟过滤,复杂数据格式的渲染。

    《Gpu Pro3》Practical Elliptical Texture Filtering on the GPU:给出了一种不使用硬件Binlnear等Filter,而是在GPU实现,可以获得更高的AnsiLevel等的Texture Filter方法。


    Procedural Texture:

    《Gpu Gems1》 Implementing Improved Perlin Noise:柏林噪声,程序噪声,根据各种输入值生成的程序噪声可以脱离于分辨率,超近细节可以有较好的噪声效果,不过高频不能高于采样率,对效果无意义,而且可能在使用纹理动画时出现斑点。这类噪声已经很早就应用于电影等工业。

    《Gpu Gems2》 Implementing Improved Perlin Noise:优化了噪声实现,基于像素着色器实现噪声,以用于凹凸贴图和其他效果,用于离线渲染。

    《Gpu Gems1》 Texture Bombing:程序化贴图,以小图拼合大图得到很近也不失真的效果。将UV空间划分,然后使用噪声随机合成图像,该方法也可以扩展到3D纹理。

    《Gpu Pro1》Virtual Texture Mapping 101:大量的复杂贴图会导致带宽以及内存瓶颈,通过Virtual Texture Mapping技术,仅保留查找表,存储TileID查找具体的小贴图进行融合,可以降低贴图消耗,用于地形较好。

    《Gpur Pro1》Accelerating Virtual Texturing Using CUDA:还是VTM,使用GPU CUDA实现,节约贴图。

    《Gpu Pro7》Adaptive Virtual Textures:Procedural Virtual Texture的改良版本,支持超大分辨率,根据距离自动选择Mipmap,结合延迟渲染+Deferred Decal可以实现开放世界超大地形超高分辨率的渲染。

     

    Tessellation & Geometry:

    《Gpu Gems1》Adaptive Tessellation of Subdivision Surfaces with Displacement Mapping:结合广度优先的递归细分,实现曲面细分效果。并且结合了Displacement Mapping.

    《Gpu Gems3》Generic Adaptive Mesh Refinement:通用的自适应网格细化,对粗糙网格替换三角形细化。

    《Gpu Pro1》As Simple as Possible Tessellation for Interactive Applications:类似Phong光照的Phong Tesselation,似乎还没有硬件支持,直接使用vertex shader实现。

    《Gpu Pro1》Rule-Based Geometry Synthesis in Real-Time:给出了一种基于规则生成程序化网格的框架,全部GPU实现,包括碰撞,不过目前看只能支持比较简单的mesh。

    《Gpu Pro1》GPU-Based NURBS Geometry Evaluation and Rendering:给出了一种基于B样条曲线生成程序化网格的实现,支持GPU加速实现,方便一些工业绘图,直接通过曲线控制网格形状。

    《Gpu Pro1》Polygonal-Functional Hybrids for Computer Animation and Games:除了三角形表示网格外,还有通过函数式表达的网格,所谓Function Representation(FRep),可以更容易地表达流体,软泥,触手等形变的物体,通过CUDA进行GPU模拟,实现了动画形变以及和普通三角形网格结合,绑定等功能。

    《Gpu Pro2》Terrain and Ocean Rendering with Hardware Tessellation:刚开始DX11支持硬件Tesselation,简要介绍了Hull Shader和Domain Shader,实现地形以及海洋渲染。

    《Gpu Pro3》Vertex Shader Tessellation:使用Vertex Shader自己实现Tesselation,在DX10下不依赖DX11的特性。

    《Gpu Pro 6》Bandwidth-Efficient Procedural Meshes in the GPU via Tessellation:CPU->GPU的带宽限制了超大超细节的Mesh渲染,文中给出了一种基于Tessellation技术,完全通过数学计算生成程序Mesh的方法,可以根据不同的细节参数生成不同细致程度的GPU Mesh,但是全在GPU就没有了视锥体剔除,需要做的是一个简单的剔除,可以给一个代理包围盒,如果在相机外,就不生成Mesh,降低后续的光栅化和Shading的消耗。

    《Gpu Pro7》Deferred Snow Deformation in Rise of the Tomb Raider:《古墓丽影·崛起》中的程序生成的雪地形变技术,齐腰大雪或者脚印都可以模拟,甚至还考虑了脚印旁边的雪堆以及过后的暴风雪回填脚印雪坑,使用了Compute Shader计算动态的Height Map,只考虑影响雪地的Mesh,不考虑雪地下的Mesh导致的突起,也就是所谓的Deferred。

    《Gpu Pro7》Catmull-Clark Subdivision Surfaces:Catmull-Clark细分网格的方式,使用B样条曲线+Tessellation实现超细致的网格细分效果。

    《Gpu Zen》Attributed Vertex Clouds:程序化生成网格,使用Instacing渲染,通过per instance data实现区分,如顶点采样attribute贴图,通过Geomerty生成具体形状,Tessellation进一步润色。

     

    Terrain:

    《Gpu Gems2》Terrain Rendering Using GPU-Based Geometry Clipmaps:通过顶点纹理实现基于GPU的几何体裁剪,尽可能将计算转移到GPU,降低地形CPU的消耗。

    《Gpu Gems3》Generating Complex Procedural Terrains Using the GPU:实时GPU生成程序地形,支持Bump,LOD,以及交互,Marching Cubes。

    《Gpu Pro1》Destructible Volumetric Terrain:使用Voxels表现地形,从Max里面从三角面转化为Voxels,以及渲染实时LOD,以及实现体素的碰撞检测。

    《Gpu Pro2》 Large-Scale Terrain Rendering for Outdoor Games:超大地形实现,包括DCC,贴图Pack,渲染等一些列流程。

    《Gpu Pro3》Real-Time Deformable Terrain Rendering with DirectX 11:压缩Heightmap,GPU解压,降低内存和带宽。Procedure Texture,Instancing,TextureArray,Tessellation。支持动态变形。

    《Gpu Pro4》GPU Terrain Subdivision and Tessellation:通过Tessellation的方式实现在GPU进行细分网格,无需预计算以及CPU计算,降低CPU->GPU消耗。

    《Gpu Pro6》Dynamic GPU Terrain:在GPU计算生成网格,使近处网格密集,远处LOD,但是对于物理碰撞,需要再从GPU将数据同步回CPU。


    Procedural Content Generation:

    《Gpu Pro2》Procedural Content Generation on the GPU:程序生成地形,高度,树密度图,通过随机生成场景。

     

    Engine Design:

    《Gpu Gems1》Managing Visibility for Per-Pixel Lighting:降低计算消耗,主要讲解剔除光源影响,深度剔除等内容,尽可能降低DC。

    《Gpu Gems1》The Design of FX Composer:FX Composer的设计,效果编辑器,主要考虑的是稳定,易扩展,方便TA使用,效率次级。通过这个工具展现D3D的效果以及应用。

    《Gpu Gems1》Using FX Composer:FX Composer的使用。

    《Gpu Gems1》Integrating Hardware Shading into Cinema 4D:介绍了如何在Cinema 4D这个离线渲染软件中接入GPU实时渲染的过程,以方便更快预览迭代。

    《Gpu Gems1》Integrating Shaders into Applications:介绍了设计一个灵活的Shader管理的功能,方便表现各种效果,简化渲染器的开发。

    《Gpu Gems2》 Implementing the mental images Phenomena Renderer on the GPU:Mental Ray离线渲染软渲染改为cg语言GPU渲染的过程。

    《Gpu Pro3》Designing a Data-Driven Renderer:详细介绍了一个渲染器的设计,包括架构,资源,渲染流程,后处理,API,数据组织。使之将引擎的架构和渲染解耦,可以支持任意的渲染风格。

    《Gpu Pro4》An Aspect-Based Engine Architecture:引擎架构设计,Aspect-Based引擎,Core,Scene Graph,Event Queue,每个Aspect都是单独的功能,依赖Core和一些Common Library,覆写实现各种Aspect的接口以实现各类自定义的功能,如渲染,文件管理,

    《Gpu Pro5》glTF: Designing an Open-Standard Runtime Asset Format:一种基于json的通用资源格式,对象,材质,mesh等序列化的功能。

    《Gpu Pro5》Managing Transformations in Hierarchy:实现一套灵活的层级的TRS系统,方便解算物体的具体世界空间Transform,Parent,以及切换父节点时Transform重新映射。

    《Gpu Pro6》Semantic-Based Shader Generation Using Shader Shaker:处理Shader管理,变体等问题。首先对比了现有的Shader管理方式,如函数调用复用代码,Uber-Shader一个超级复杂Shader搞定一切,封装好函数通过Graph编辑(UE4),Template-based方式封装大部分功能,根据需要自行扩展接口(Unity的surface)。文中给出了一种指定输入块和输出块的Shader编写方法,然后根据A*搜索按照寻路的方式链接Shader的Shader管理方式,实现复杂Shader管理以及跨平台编译。

     

    Cross Platform&Graphic API:

    《Gpu Gems1》An Introduction to Shader Interfaces:CG语言的一个功能,类似C#中泛型接口,比如可以多态实现各类光照效果,而无需#if def等,此外还有可变长数组。

    《Gpu Gems2》GPU Image Processing in Apple's Motion:在Apple上实现图像处理相关,感觉主要是吐槽ATI各种坑。

    《Gpu Pro1》[Mobile] Migration to OpenGL ES 2.0:主要介绍了一下GLES2.0相关的内容,毕竟刚开始在移动上用ES2.0。

    《Gpu Pro1》[Moblie]iPhone 3GS Graphics Development and Optimization Strategies:Iphoe3GS,PowerVR显卡移动平台GLES2.0相关内容,给出了若干移动平台的优化,以及PVRTC压缩相关内容。

    《Gpu Pro1》Porting Code between Direct3D9 and OpenGL 2.0:对比了DX和GL在Shader,Buffer,Texture,FrameBuffer,API等不同。

    《Gpu Pro1》Practical Thread Rendering for DirectX 9:DX9下多Command Buffer实现多线程。

    《Gpu Pro6》ANGLE: Bringing OpenGL ES to the Desktop:使用DX11模拟OpenGLES,WebGL。Shader转化,调试问题,Uniform Buffer,Transform Feedback,Pixel Pack Buffers等GLES3的功能如何对应转化到DX下实现。

    《Gpu Zen》Profiling and Optimizing WebGL Applications Using Google Chrome:Web GL下的优化,其实更偏重的是介绍WebGL相关内容,工具,非通用优化。

     

    Pipeline & GPU Architecture & Algorithm:

    《Gpu Gems2》Streaming Architectures and Technology Trends:GPU的流式体系结构,高性能计算等。

    《Gpu Gems2》The GeForce 6 Series GPU Architecture:GeForce6系列GPU的架构,SM3.0,分支,结构,MRT等支持。

    《Gpu Gems2》GPU Flow-Control Idioms:讲述了GPU上分支控制相关内容,新硬件支持动态分支。

    《Gpu Gems2》Conservative Rasterization:介绍了两种保守光栅化的算法,这个东西在GPU遮挡剔除等很有用,DX12已经直接内置。

     

    Quaternion:

    《Gpu Pro3》Quaternion-Based Rendering Pipeline:对比四元数和矩阵相关内容,包括TBN的实现等,基于四元数的管线。

    《Gpu Pro5》Quaternions Revisited:使用四元数代替引擎中的3x3旋转矩阵,实现法线贴图TBN矩阵转换,基本坐标变换,Instancing,skining,morph等效果,降低带宽和存储消耗

     

    GPU Compute:

    《Gpu Gems1》A Toolkit for Computation on GPUs:开始用GPU搞事情了,用GPU实现映射,约减,排序,搜索。

    《Gpu Gems2》Mapping Computational Concepts to GPUs:将各种通用计算映射到GPU的各种流水线阶段。

    《Gpu Gems2》Taking the Plunge into GPU Computing:从现有CPU计算转化到GPU遇到的挑战。

    《Gpu Gems2》Implementing Efficient Parallel Data Structures on GPUs:GPU上实现各种数据结构,一维,二维,三维数组,静态稀疏结构,动态稀疏结构。

    《Gpu Gems2》Stream Reduction Operations for GPGPU Applications:通过GPU实现过滤,一一次扫描和搜索过滤一个数据集,并由分支循环的新特性进一步优化。

    《Gpu Gems2》Octree Textures on the GPU:在GPU上构建八叉树,精确的层级结构,可以用于诸如在模型上绘制的功能。

    《Gpu Gems2》GPU Computing for Protein Structure Prediction:蛋白质结构预测的GPU计算。

    《Gpu Gems2》A GPU Framework for Solving Systems of Linear Equations:一个GPU上解线性方程组的框架,偏微分方程。

    《Gpu Gems2》Options Pricing on the GPU:GPU上计算期权定价。(我就想问问GPU累不累,咋啥都GPU算了)

    《Gpu Gems2》Improved GPU Sorting:优化的GPU排序。

    《Gpu Gems2》Medical Image Reconstruction with the FFT:基于FFT的医学图像重建。

    《Gpu Gems3》Fast N-Body Simulation with CUDA:Gpu全对N-body算法实现。

    《Gpu Gems3》Fast Virus Signature Matching on the GPU:基于GPU的病毒特征快速匹配(蛋白质搞完了就搞病毒,GPU咋这么忙?)

    《Gpu Gems3》AES Encryption and Decryption on the GPU:基于新版本GPU,处理整数流的功能,可以实现ASE块密码算法。

    《Gpu Gems3》Efficient Random Number Generation and Application Using CUDA:GPU上随机数生成,很重要的功能。蒙特卡洛方法的基础,天生并行,非常适合GPU。Wallae高斯生成器。期权等计算仿真示例。

    《Gpu Gems3》Imaging Earth's Subsurface Using CUDA:用CUDA进行地震数据计算模拟,用于地球勘探资源,地震分析等。(我靠,病毒搞完了又来搞地球?好吧,不得不说GPU在其他领域也是很重要的,比如Alpha Go最开始都用GPU算的,虽然后来有专门的TPU了,但是GPU的计算能力仍然不容小觑)。

    《Gpu Gems3》Parallel Prefix Sum (Scan) with CUDA:CUDA并行前缀和,扫描法。

    《Gpu Gems3》Incremental Computation of the Gaussian:高斯函数的增量计算。在规则间隔点上计算高斯曲线。加速多项式指数级的函数。

    《Gpu Gems3》Using the Geometry Shader for Compact and Variable-Length GPU Feedback:Geometry Shader处理紧凑和可变长度的GPU feedback。可以构建直方图,压缩,Hough,图像处理的角点检测等。

    《Gpu Pro1》Spatial Binning on the GPU:GPU排序装箱问题。

    《Gpu Pro2》A Fast Poisson Solver for OpenCL using Multigrid Methods:计算泊松结算,可以用于流体等。

    《Gpu Pro5》[Mobile] Optimizing OpenCL Kernels for the ARM® Mali™-T600 GPUs:对 ARM® Mali™-T600 GPUs设计OpenCL的优化。

    《Gpu Pro5》Two-Level Constraint Solver and Pipelined Local Batching for Rigid Body Simulation on GPUs:物理模拟,GPU实现约束解算

    《Gpu Pro5》 Non-separable 2D, 3D, and 4D Filtering with CUDA:使用CUDA医学影像方面的一些滤波处理。

     

    Fluids & Liquids & Metaball:

    《Gpu Gems1》Fast Fluid Dynamics Simulation on the GPU:介绍了GPU上模拟流体相关的一些数学知识等,使用GPU可以模拟一些复杂的运算效果。

    《Gpu Gems2》Flow Simulation with Complex Boundaries:复杂边界的流体模拟,Lattice Boltzmann,基于GPU的边界处理。

    《Gpu Gems3》Point-Based Visualization of Metaballs on a GPU:GPU上变形球,受限速度,斥力,粒子密度,不使用Marching Cube以及Ray Tracing,而是通过将粒子约束到表面采样。

    《Gpu Gems3》Real-Time Simulation and Rendering of 3D Fluids:实时流体渲染,运动流体方程,固体流体交互。体素化,RayMarching,火焰,烟雾体渲染。

    《Gpu Pro2》Simple and Fast Fluids:通过一个Pixel Shader的Filter实现流体,主要是实现NavierStokes方程(纳维-斯托克斯方程),可以模拟一些液体流动效果,火焰等。

    《Gpu Pro5》Simple Rasterization-Based Liquids : 简单的基于光栅化的液体渲染。

    《Gpu Pro5》Screen-Space Deformable Meshes via CSG with Per-Pixel Linked Lists:逐像素链表构造屏幕空间形变效果。

    《Gpu Pro7》Interactive Sparse Eulerian Fluid:DX11下模拟烟雾性质(喷气)的流体效果

     

    Physics:

    《Gpu Gems3》Real-Time Rigid Body Simulation on GPUs:实时GPU上的刚体仿真效果。借助GPU的计算实现大规模的模拟,并且可以适用于其他类型,如液体。

    《Gpu Gems3》Broad-Phase Collision Detection with CUDA:CUDA进行宽阶段碰撞检测,就是粗略判断碰撞。空间划分,排序。

    《Gpu Gems3》LCP Algorithms for Collision Detection Using CUDA:Havok的分享,刚体碰撞一般分为3个阶段,宽阶段,窄阶段,解析阶段。文中主要针对精细的碰撞进行解析,LCP。

    《Gpu Pro1》Real-Time Interaction between Particles and the Dynamic Mesh on the GPU:粒子(流水)和动态的Mesh碰撞,给出一种Volumetric方式表示Mesh的方法。

    《Gpu Pro 6》Real-Time Deformation of Subdivision Surfaces on Object Collisions:大多数物理引擎只支持刚体碰撞检测,文中给出了一种可以计算形变以及细分物体等非刚体类型的碰撞,先用基本的刚体检测,然后将对象体素化(可以控制精度),完全在GPU进行细分物体的细节碰撞检测。

    《Gpu Pro7》 A 3D Visualization Tool Used for Test Automation in the Forza Series:基于Mesh的物理需要依赖网格本身,但是如果模型制作时不规范,有洞或者法线错误会导致物理引擎出错,所以文中给出了一种检测工具。

     

    Stereogram & VR:

    《Gpu Gems1》Real-Time Stereograms:实时绘制立体效果,那种对眼看能出现立体的?表示这辈子可能都不会研究到这个吧。

    《Gpu Zen》Efficient Stereo and VR Rendering:介绍了一下VR Stereo渲染相关的内容,优化,Shader等。

    《Gpu Zen》Understanding, Measuring, and Analyzing VR Graphics Performance:介绍VR相关内容,VSync,增加GPU Trace对VR性能进行优化。

     

    Others:

    《Gpu Gems2》Computer Vision on the GPU:计算机视觉,边缘检测,特征向量,全景图等。

    《Gpu Gems3》Playable Universal Capture:全方位的动作捕捉,主要是面部表情。

    《Gpu Gems3》Object Detection by Color: Using the GPU for Real-Time Video Image Processing:实时图像处理跟踪,Core Image图像处理框架,实现视频中追踪关键对象替换等。

    《Gpu Pro1》[Mobile]Touchscreen-Based User Interaction:触屏用户交互方案,计算触摸输入相关。

    《Gpu Pro1》[Mobile]Optimizing a 3D UI Engine for Mobile Devices:在移动平台实现3D UI相关功能。

    《Gpu Pro3》A WebGL Globe Rendering Pipeline:Web GL(基于GLES2.0)实现地球绘制

    《Gpu Pro4》Kinect Programming with Direct3D 11:Kinect设备介绍,相关功能实现等。

    《Gpu Pro7》Octree Mapping from a Depth Camera:Kinect,CUDA,从Depth Camera摄像机信息重建三维场景。

     

     

    展开全文
  •  本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处  ...文章盘点、提炼和总结了《GPU Gems 3》全书总计28章的核心内容。 同时这篇文章,也是【GPU精粹与Shader编程】系列文章对GPU精粹...

     

            本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处  

            文章链接: https://zhuanlan.zhihu.com/p/44671434

    本文是【GPU精粹与Shader编程】系列的第七篇文章。文章盘点、提炼和总结了《GPU Gems 3》全书总计28章的核心内容。

    同时这篇文章,也是【GPU精粹与Shader编程】系列文章对GPU精粹三部曲中《GPU Gems》、《GPU Gems 2》、《GPU Gems 3》组成的第一部曲的完结篇,是一个短暂的里程碑。

    下篇文章,将开启全新的《GPU Pro》系列。

     

    《GPU Gems 3》全书核心框架脉络思维导图

    以下是《GPU Gems 3》全书核心章节的思维导图:

     

    另外值得注意的几点是:

    • 《GPU Gems 3》出版于2007年8月12日,全书共1008页,41章。
    • 《GPU Gems 3》的英文原版已经由NVIDIA开源: https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_pref01.html
    • 本文对《GPU Gems 3》全书渲染相关的前28章进行了盘点、提炼与总结。
    • 本文正文可以作为一个文字版的索引,方便后续通过此文,对《GPU Gems 3》一书的内容进行快速分类检索与对应章节的深入阅读与研究。

    OK,下面开始正文。

     

    全文内容总览

     

    本文总结的《GPU Gems 3》中这28章,分别为:

    第一部分 几何体(Geometry)

    • 第1章 使用GPU 生成复杂的程序化地形(Generating Complex Procedural Terrains Using the GPU)
    • 第2章 群体动画渲染(Animated Crowd Rendering)
    • 第3章 DirectX 10 中的混合形状(DirectX 10 Blend Shapes: Breaking the Limits)
    • 第4章 下一代SpeedTree 渲染(Next-Generation SpeedTree Rendering)
    • 第5章 通用自适应网格细化(Generic Adaptive Mesh Refinement)
    • 第6章 对树的GPU 生成程序式风动画(GPU-Generated Procedural Wind Animations for Trees)
    • 第7章 GPU 上基于点的变形球可视化(Point-Based Visualization of Metaballs on a GPU)

    第二部分 光照和阴影(Light and Shadows)

    • 第8章 区域求和的差值阴影贴图(Summed-Area Variance Shadow Maps)
    • 第9章 使用全局光照交互电影级重光照(Interactive Cinematic Relighting with Global Illumination)
    • 第10章 在可编程GPU 上实现并行分割阴影贴图(Parallel-Split Shadow Maps on Programmable GPUs)
    • 第11章 基于层次化的遮挡剔除和几何着色器的高效鲁棒阴影体(Efficient and Robust Shadow Volumes Using Hierarchical Occlusion Culling and Geometry Shaders)
    • 第12章 高质量的环境光遮蔽(High-Quality Ambient Occlusion)
    • 第13章 后处理特效:体积光散射(Volumetric Light Scattering as a Post-Process)

    第三部分 渲染(Rendering)

    • 第14章 用于真实感实时皮肤渲染的高级技术(Advanced Techniques for Realistic Real-Time Skin Rendering)
    • 第15章 可播放的全方位动作捕捉(Playable Universal Capture)
    • 第16章 Crysis 中植被的程序化动画和着色(Vegetation Procedural Animation and Shading in Crysis)
    • 第17章 鲁棒的多镜面反射和折射(Robust Multiple Specular Reflections and Refractions)
    • 第18章 用于浮雕映射的松散式锥形步进(Relaxed Cone Stepping for Relief Mapping)
    • 第19章 《Tabula Rasa》中的延迟着色(Deferred Shading in Tabula Rasa)
    • 第20章 基于GPU的重要性采样(GPU-Based Importance Sampling)

    第四部分 图像效果(Image Effects)

    • 第21章 真实Impostor(True Impostors)
    • 第22章 在GPU上烘焙法线贴图(Baking Normal Maps on the GPU)
    • 第23章 高速的离屏粒子(High-Speed, Off-Screen Particles)
    • 第24章 保持线性的重要性(The Importance of Being Linear)
    • 第25章 在GPU 上渲染矢量图(Rendering Vector Art on the GPU)
    • 第26章 通过颜色进行对象探测:使用 GPU 进行实时视频图像处理(Object Detection by Color: Using the GPU for Real-Time Video Image Processing)
    • 第27章 后处理效果:运动模糊(Motion Blur as a Post-Processing Effect)
    • 第28章 实用景深后期处理(Practical Post-Process Depth of Field)

     

     

    第一部分 几何体(Geometry)

     

    第1章 使用GPU 生成复杂的程序化地形(Generating Complex Procedural Terrains Using the GPU)

    【关键词】

    • 程序化地形(Procedural Terrains)

    • MC(Marching Cubes)算法

    • 密度函数(Density Function)

    • 地形生成(Terrain Generation)

    【内容盘点】

    作为《GPU精粹3》的开篇章节,这章给出了一个使用GPU在交互速率下生成复杂程序化三维地形的方法。同样也展示了如何对地形进行纹理映射和着色、如何为地形创建LOD的方案。

    阅读这一章时让我想起了近年两款大作《地平线:黎明》和《幽灵行动:荒野》在GDC 2017上关于程序化地形和植被生成的分享:

    这边是《幽灵行动:荒野》在GDC 2017程序化地形技术演示视频:

    https://www.youtube.com/watch?v=JIQ_YVwUONA

    而这边是《地平线:黎明》中Decima Engine程序化地形和植被生成的演示视频:

    https://www.youtube.com/watch?v=t258ePDlxtQ

     

    图《地平线:黎明》的地形和植被程序化生成

    图《地平线:黎明》的地形和植被程序化生成

    图 《幽灵行动:荒野》中程序化地形的11+种生物群系和140+种地表材质

    图 《幽灵行动:荒野》的 32k x 32k x 4 layer的程序化地形大世界,让其成为了育碧至今地形最大的开放世界游戏

    图 《幽灵行动:荒野》中基于程序化地形的16平方公里的湖面,河流和溪流面积

    图 《幽灵行动:荒野》中基于程序化地形的超过600公里的道路

    OK,回到本章内容中来。

    传统上,程序化地形(Procedural Terrains)受限于CPU生成的,且用GPU进行渲染的高度场(Height Fields)。然而,生成复杂地形是一项高度并行化的任务,CPU的串行处理本质上不适合完成这项工作。此外,CPU生成高度场的方法也无法很好地提供吸引人的地形特征(如凹洞和凸起物)。为了交互级的帧率下生成高度复杂的程序化地形,文中使用GPU和来进行此项工作。

    理论上,地形表面可以用单个函数完整地进行描述,这个函数被称为密度函数(Density Function)。

    图 一个已知8个棱角密度(Density)值的体素(黑点指示了棱角处的正密度值,每个棱角为一个“位(byte)”,用于在总共8位的情况中进行判断)

    使用GPU来生成地形块所需要的多边形,这个块进行进而被细分成 32 x 32 x 32的小单元,即体素(Voxel)。Marching Cubes算法允许我们在一个单独的体素中生成正确的多边形。MarchingCubes(简称MC)算法是面绘制算法中的经典算法,它是W.Lorensen等人于1987年提出来的一种体素级重建方法。MarchingCubes算法也被称为“等值面提取”(Isosurface Extraction)算法。

    下图阐述了应用Marching Cube算法的一些基本案例

    图 Marching Cubes算法的14种基本案例(而其他的240种案例仅仅是这些纪元案例的旋转或翻转的结果)

    首先,将世界划分成无限数目的等大小立方体块。在世界空间坐标系中,每个立方块的大小为1 x 1 x 1。然而,每个块中有32^3个体素可能含有多边形。为当前视锥可视的地形块动态划分一个含有大约300个顶点缓冲区的内存池,较近的块具有较高的优先权。随着用户的移动,当有新的地形块进入视锥时,视锥中被裁掉的最远或最近的顶点缓冲区便被回收,以被新的块使用。

    而对每一帧的渲染思路方面,文中的思路是,根据位置从前到后对所有的顶点缓冲区进行排序(它们的包围盒已知)。然后生成所有需要的立方体块,剔除最远距离的块。最终,按照从前到后的顺序绘制各个块,以免在被遮挡的块上进行像素着色时浪费大量的时间。

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch01.html

     

    第2章 群体动画渲染(Animated Crowd Rendering)

    【关键词】

    • 群体动画渲染(Animated Crowd Rendering)

    • 蒙皮实例化(Skinned Instancing)

    • 性能优化(Performance Optimization)

    • Draw Call降低(Reduce Draw Call)

    【内容盘点】

    使用实例化(instancing)方法,可以通过减少Draw Call、状态更改以及缓冲区更新的数量来减少CPU的开销。

    这章中展示了如何使用顶点纹理存取的DirectX 10实例化来实现基于硬件调色板的蒙皮角色(skinned characters)。这个demo同时使用了常量缓冲区和系统变量SV_InstanceID来有效实现这项技术。在Intel Core 2 Duo GeForce 8800 GTX显卡上,能够实现大约1万个人物拥有不同的动画和蒙皮。

    图 动画人群的特写镜头

    图 使用Skinned实例化的群体动画

    蒙皮实例化(Skinned instancing)这项技术适用于实时地渲染数量庞大且彼此独立的动画人物。它使用顶点纹理存取来读取存储在单一纹理中的动画数据,也使用了SV_InstanceID来索引包含了示例数据的常量缓冲区(位置和动画时间)。而配合一个简单易行的LOD系统,能在合适距离上有更高的多边形/光照细节。

    图 Instancing Basics

    图 LOD数据的布局

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch02.html

     

    第3章 DirectX 10 中的混合形状(DirectX 10 Blend Shapes: Breaking the Limits)

    【关键词】

    • 混合形状(blend shapes)

    • 流输出方法(Stream-Out Method)

    • 缓冲区-模板方法(Buffer-Template Method)

    【内容盘点】

    本章中,作者展示了流输出方法(Stream-Out Method)和缓冲区-模板方法(Buffer-Template Method)两种方法,来突破之前基于GPU加速的混合形状的应用限制。

    图 Little Vampire blendshapes@ Artstation by Jimmy Levinsky

    图 Dawn Demo中拥有50多个混合形状的角色

    上图是基于上述两种方案在模型Dawn的脸上组合出了54种面部表情的Demo。

    其中,流输出方法(Stream-Out Method)可以打破DirectX 10中属性个数限制,思路是使用迭代的方式来操作网格。通过在每个pass中组织当前活动混合形状的子集(subset),只需每个pass中少量的属性。

    图 一次仅使用全部混合形状的一个子集

    而缓冲区-模板方法(Buffer-Template Method)的思路是使用GPU来实现遍历(与流输出方法类似)。DirectX 10通过在顶点着色器中提供流控制来管理遍历,并提供了将缓冲区与着色器资源视图相绑定以存取数据的能力,进而使得GPU遍历成为可能。

    图 使用循环来减少API调用

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch03.html

     

    第4章 下一代SpeedTree 渲染(Next-Generation SpeedTree Rendering)

    【关键词】

    • SpeedTree

    • 植物渲染(Vegatable Rendering)

    • 轮廓裁剪(Silhouette Clipping)

    • 树叶光照(Leaf Lighting)

    • 半透明覆盖算法(Alpha to Coverage)

    【内容盘点】

    众所周知,SpeedTree是Interactive Data Visualization, Inc.(IDV)公司出品的用来实时渲染树木的中间件。

    图 SpeedTree效果图 @ARK

    图 SpeedTree示例

    图 SpeedTree示例

    文章提到,使用了SpeedTree的游戏可以对渲染方式进行更为灵活的选择。在本章中,使用了当时较新的显卡GeForce 8800的几个特性为SpeedTree生成下一代高质量的扩展。首先,轮廓剪切增加了树枝和树干外形的细节。其次,阴影贴图提供了逐树叶级的真实感自我遮挡。除此之外,我们进一步使用了双页面光照模型和高动态范围渲染来优化光照。最后,多重采样和抗锯齿和半透明覆盖(alpha to coverage)提供了非常高的视觉质量,避免了锯齿的失真。

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch04.html

     

    第5章 通用自适应网格细化(Generic Adaptive Mesh Refinement)

    【关键词】

    • 自适应网格优化(Adaptive Mesh Refinement)

    • 自适应优化模型(Adaptive Refinement Patterns,ARP)

    • 深度标签(Depth-Tagging)

    【内容盘点】

    这章给出了一个单通道的、具有普通适性的顶点程序,以对任意拓扑形状的网络进行动态的自适应优化。

    图 文中的通用自适应网格细化的工作流架构

    从静态或动态的粗网格开始,该顶点程序用存储在GPU存储器中的一组预镶嵌图案中的细化三角形补丁(refined triangular patch)替换每个三角形,所述三角形补丁根据所需的局部几何细化量来选择。

    通过在参数空间中对这些模式进行编码,这种一对多(one-to-many),即时的(on-the-fly)三角形替换被转换为顶点位移函数的简单重心插值,其可以由用户提供,也可以在现有的数据基础上进行计算。除了顶点位移之外,在细化过程中还可以使用相同的过程来插值任何其他每顶点属性。

    该方法在某种意义上是完全通用的,即对网格拓扑,位移函数或细化级别没有任何限制。

    图 自适应细化的模式

    图 通过深度标记控制自适应GPU细化

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch05.html

     

    第6章 对于树的GPU 生成程序式风动画(GPU-Generated Procedural Wind Animations for Trees)

    【关键词】

    • 程序式风动画(Procedural Wind Animations)

    • 树木动画渲染(Rendering Tree Animation)

    • 噪声(Noise)

    • 风场(Wind Field)

    【内容盘点】

    这章描述了一个程序式的方法,可以生成真实受风场影响的树木动画。该方法的主要目标是实现具有大量植被的大型开放环境的模拟和可视化。

    具体而言,这是一种在受到诸如风场等外力影响的情况下合成树木运动的方案,基于将树木运动建模为随机过程(stochastic processes)等方法,并通过添加简单规则对其进行扩展,同时模拟树枝行为中的空气动力学特性。文中还提供了基于GPU的流体模拟与文中方法相结合的方案,以改善对风的真实感的模拟。文中还给出了在GPU上进行运动合成的详细说明,以及基于DirectX 9和DirectX 10的运动合成方法的实现。

    图 由三层节点深层结构表示的树结构

    图 用于驱动树干动画的噪声函数

    图 影响给定顶点的分支索引列表,其存储在顶点属性中

    图6-8为每个分支合成角运动(Angular Motion)

    图 DirectX 10下的GPU管线

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch06.html

     

    第7章 GPU 上基于点的变形球可视化(Point-Based Visualization of Metaballs on a GPU)

    【关键词】

    • 元球/变形球(metaball)

    • 表面粒子(Surface Particles)

    • 局部粒子斥力(Local Particle Repulsion)

    • 哈希表(Hash Table)

    • 限制粒子(Constraining Particles)

    【内容盘点】

    变形球(metaball),又常译作元球,是计算机图形学中的 n维物体。变形球渲染技术最初由 Jim Blinn 于1980年代初提出。

    图 两个变形球的融合

    这章给出了一种在GPU上以交互式速率渲染变形球的方法,其有效且高效地在GPU上实现了Withkin and Heckbert 1994的基于点的隐式表面可视化,在保持互动级帧速率的情况下渲染变形球。

    该方法由三部分组成:计算受限速度、斥力及粒子密度,来实现接近一致的粒子分布。

    需要注意的是,该方法并不是采用步进立方体(Marching Cubes)算法来生成多边形列表,而是通过将自由移动的粒子约束到这个表面来对元球的隐式表面进行采样。其的目标是通过渲染数千个粒子将元球可视化为光滑表面,每个粒子覆盖一个微小的表面区域。

    为了在GPU上成功应用这种基于点的技术,文中解决了三个基本问题。首先,需要评估元球的隐式函数及其每个渲染粒子的梯度,以便将粒子约束到曲面。为此,文章设计了一种新颖的数据结构,用于快速评估片段着色器中的隐式函数。其次,需要将颗粒均匀地分布在表面上。对此,文章提出了一种快速方法,用于在每个粒子上执行最近邻搜索,在GPU上进行两次渲染传递。该方法用于根据平滑粒子流体动力学方法计算排斥力。第三,为了进一步加速颗粒分散,文中也提出了一种将颗粒从高密度区域转移到表面上的低密度区域的方法。

    图 CPU上执行的流体模拟循环以及在GPU上执行的流体可视化循环

    图 排斥(Repulsion)算法

    图 逐粒子光照、带有纹理和混合的流表面。 左图为无重力环境中的圆块状对象,右图为杯子中的水

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch07.html

     

    第二部分 光照和阴影(Light and Shadows)

     

    第8章 区域求和的差值阴影贴图(Summed-Area Variance Shadow Maps)

    【关键词】

    • 差值阴影贴图(Variance Shadow Maps)

    • 区域求和差值阴影贴图(Summed-Area Variance Shadow Maps,SAVSM)

    • 百分比临近过滤(Percentage-Closer Filtering)

    【内容盘点】

    这章主要讨论了阴影贴图过滤和柔和阴影,回顾了差值阴影贴图算法,并解释了如何用它来解决很多常见的阴影贴图问题(如缩变锯齿、偏移及软阴影)。同时还介绍了一种简单且有效的技术,该技术能够显著减少差值阴影贴图(Variance Shadow Maps,VSM)中的light-bleeding失真。最后,文章介绍了一种基于差值阴影贴图(Variance Shadow Maps,VSM)和区域求和表(Summed-Area Tables,SAT)的实时阴影算法。

    对任意的方波过滤器区域,该算法都能有效地计算出阴影权值,最终文章得出结论,区域求和的差值阴影贴图(Summed-Area Variance Shadow Mapping ,SAVSM)是计算没有锯齿现象的柔和阴影的理想算法。

    图8-10样本数据和相关的区域求和表

    图 区域求和的基于差值阴影贴图(Summed-Area Variance Shadow Mapping ,SAVSM)算法渲染的硬边和软边阴影

    图 文中基于区域求和的差值阴影贴图技术渲染出的效果图

    图 文中基于区域求和的差值阴影贴图技术渲染出的效果图

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch08.html

     

    第9章 使用全局光照交互电影级重光照(Interactive Cinematic Relighting with Global Illumination)

    【关键词】

    • 全局光照(Global Illumination)

    • 重光照(Relighting)

    • 间接光照(indirect illumination)

    • 压缩稀疏矩阵(Packing Sparse Matrix Data)

    【内容盘点】

    这章中介绍了用于电影级光照设计的GPU重光照(Relighting)引擎。该方法对传统的帧缓存方法进行了扩展,支持多次反射的间接光照,可应用于具有高几何复杂性、光泽材质和使用程序化着色器所得到的灵活的直接光照模型的场景。

    图 文中的重光照算法架构

    以下是文中重光照算法的完整伪代码:

    Texture computeLighting(light, viewSamples, gatherSamples)
    {
    
        // Direct illumination on view and gather samples
        viewDirect = computeDirectIllumination(light, viewSamples);
        gatherDirect = computeDirectIllumination(light, gatherSamples);
    
        // Multibounce indirect illumination on gather samples
        gatherDirectWavelet = waveletTransform(gatherDirect);
        gatherIndirect =sparseMultiply(multiBounceWaveletMatrix, gatherDirectWavelet);
        gatherFull = gatherDirect + gatherIndirect;
    
        // Final bounce from gather to view samples
        gatherFullWavelet = waveletTransform(gatherFull);
        viewIndirect =sparseMultiply(finalGatherWaveletMatrix, gatherFullWavelet);
    
        // Combine into final image.
        viewFull = viewDirect + viewIndirect;
    
        return viewFull;
    
    }
    

    图 该文中介绍的系统中使用点光源灯和聚光灯渲染的场景

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch09.html

     

    第10章 在可编程GPU 上实现并行分割阴影贴图(Parallel-Split Shadow Maps on Programmable GPUs)

    【关键词】

    • 并行分割阴影贴图(Parallel-split shadow maps,PSSMs)

    • 阴影贴图(Shadow Maps)

    • 多阴影贴图(Multiple Shadow Maps)

    • 几何着色器克隆(Geometry Shader Cloning)

    【内容盘点】

    本章提出了一种高级阴影贴图技术——“并行分割阴影贴图(Parallel-Split Shadow Maps,PSSMs)”,可以在大型环境中提供抗锯齿和实时的光影效果,文章同样展示了在目前的可编程GPU中这种技术的实现细节,提供了多种实现方式。

    在此技术中,视锥体使用平行于投影面积的多个剪辑平面被分割成多个深度层,并且每个层会被一个独立的阴影贴图所渲染。如下图所示。

    该算法主要步骤有:

    • 步骤1:分割视锥体(Splitting the View Frustum)

    • 步骤2:计算光的变换矩阵(Calculating Light's Transformation Matrices)

    • 步骤3和4:产生PSSMs和综合阴影(Generating PSSMs and Synthesizing Shadows)

    图PSSMs对三个特定于硬件实现的渲染管线的可视化

    图 并行分割的阴影贴图在Dawnspire:Prelude游戏中的应用

    图 SSM和Multipass PSSM的比较

    图 渲染阴影贴图基于几何着色器克隆(Geometry Shader Cloning)的GPU渲染管道

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch10.html

     

    第11章 基于层次化的遮挡剔除和几何着色器的高效鲁棒阴影体(Efficient and Robust Shadow Volumes Using Hierarchical Occlusion Culling and Geometry Shaders)

    【关键词】

    • 阴影体(Shadow Volumes)

    • 层次化的遮挡剔除(Hierarchical Occlusion Culling)

    • 几何着色器(Geometry Shaders)

    【内容盘点】

    这章通过使用非常规的生成阴影几何体的方法,实现了一种非常鲁棒的阴影体渲染技术,该技术对于复杂的网格模型同样有效。通过结合层次硬件遮挡查询(hierarchical hardware occlusion)和几何着色器,文章同样在那些之前使用模板阴影效果不太好的场景中达到了很高的性能。该方法的实现主要包括,针对低质量网络的鲁棒阴影,使用几何体着色器动态生成阴影体,使用层次化遮挡裁剪提高性能,三个部分。

    图 使用动态阴影体方法生成的实时渲染效果

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch11.html

     

    第12章 高质量的环境光遮蔽(High-Quality Ambient Occlusion)

    【关键词】

    • 环境光遮蔽(Ambient Occlusion)

    • 平滑处理不连续(Smoothing Discontinuities)

    • 波形因子(form factor)

    【内容盘点】

    Buuel在2005年提出了一种新技术来对环境光遮蔽进行近似,所采用的方法是将遮蔽整合到自适应对模型层次的遍历过程中。这种技术在模拟光滑变动的阴影方面效果很好,但对于输入模型,在高质量的应用方面不够鲁棒。

    本章对该方法进行了阐述,并在实践中进行了改进,使其更实用,对更普遍的模型的更加鲁棒。思路方面,保持算法的基本骨架不变 -该章节内容自适应地对存储在树中的粗遮挡解决方案中的遮挡进行求和,而一些关键变化显着提高了结果的稳健性,最终得到了令人信服的光滑的软阴影,以及具有真实感的多样局部细节。而改进思路方面,可分为,对不连续处进行平滑滑处理(Smoothing Discontinuities),和移除尖点并加入细节(Removing Pinches and Adding Detail)两部分。

    图 不连续处的平滑处理:过渡区的几何

    图 移除尖点并加入细节:将三角形剪切为可见的四边形

    图 本章算法实现的汽车模型中环境光遮蔽的比较【左上:应用于逐顶点的原始算法;左下:应用于逐片段的原始算法;右上:应用于平面法线(flat normals)的新算法;右下:应用于光滑着色法线的新算法】

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch12.html

     

    第13章 后处理特效:体积光散射(Volumetric Light Scattering as a Post-Process)

    【关键词】

    • 体积光散射(Volumetric Light Scattering)

    • 后处理(Post-Process)

    • 云隙光(Crepuscular Rays)

    • 屏幕空间遮蔽(Screen-Space Occlusion)

    【内容盘点】

    本章中提出了一种简单的后处理方法,该方法可以产生由于大气中阴影引起的体积光散射效果。我们对已有的日光散射(daylight scattering)的分析模型进行了改进,将体遮挡效果包含在内,并且给出了其在像素着色器中的实现方法。

    内容方面,包括云隙光(Crepuscular Rays)、体积光散射(Volumetric Light Scattering)、后处理像素着色器(Post-Process Pixel Shader)、屏幕空间遮蔽方法(Screen-Space Occlusion Methods)几部分。

    图 屏幕空间中的光线投射

    图 基于本章实现的实时动画场景中的体积光散射

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch13.html

     

    第三部分 渲染(Rendering)

     

    第14章 用于真实感实时皮肤渲染的高级技术(Advanced Techniques for Realistic Real-Time Skin Rendering)

    【关键词】

    • 皮肤渲染(Skin Rendering)

    • 次表面散射(Subsurface Scattering)

    • 纹理空间漫反射(Texture-Space Diffusion)

    • Bloom过滤器(Bloom Filter)

    【内容盘点】

    这章是《GPU Gems 3》中的核心章节,《GPU Gems 3》书的封面即是选取的本章的渲染效果图。自其问世以来,就成为了皮肤渲染领域经常会被参考到的文章,可谓皮肤渲染技术的集大成者,奠基之作。

    内容方面,文章从皮肤外观开始,总结出实时皮肤渲染系统由两个分量组成:

    • 镜面反射分量(specular reflection component)

    • 次表面散射分量(subsurface scattering component)

    文中详细描述了这两个分量的GPU实现,包括漫散射(diffuse scattering)理论的回顾和漫散射扩散剖面(diffuse scattering profiles)的新公式的呈现。

    图 多层皮肤模型

    散射理论(Scattering Theory)方面,文章首先讲到了扩散剖面(diffusion profile)的概念,然后是高斯和的扩散剖面(A Sum-of-Gaussians Diffusion Profile),以及适于皮肤的高斯和(A Sum-of-Gaussians Fit for Skin)。

    高级次表面散射(Advanced Subsurface Scattering)方面,文章讲到了纹理空间漫反射(texture-space diffusion)[Borshukov and Lewis 2003]

    通过改进透射阴影贴图(ranslucent shadow maps)[Dachsbacher and Stamminger 2004]来计算穿过表面的深度,并将阴影区域连接到面向光的表面上的位置,完成穿过如耳朵类似表面区域的透射(Transmission)效果。

    图 一个实时的皮肤渲染结果【这幅图像十分接近Donnerand Jesen 2005的渲染结果,但其生成所需的时间要少许多】

    另外,关于实时皮肤渲染技术总结,可以参考本系列文章中的上一篇文章:《:真实感皮肤渲染技术总结》https://zhuanlan.zhihu.com/p/42433792

    本章英文原书全文传送门: https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch14.html

     

    第15章 可播放的全方位动作捕捉(Playable Universal Capture)

    【关键词】

    • 全方位捕捉(Universal Capture)

    • 动作捕捉(Motion Capture)

    • 主成分分析(Principal Component Analysis, PCA)

    • 数据捕捉(Data Acquisition)

    【内容盘点】

    这章讨论了一个全方位捕捉(Universal Capture)的实时实现方法,用于真实感人物角色的动作以及渲染,该方法从电影《黑客帝国》中改进而来。此方法基于对变动漫反射纹理贴图的PCA压缩以及GPU解压缩。而纹理贴图通过当时最先进的脸部特征捕捉系统得到。而结果已经通过测试并应用到高质量的实时原型系统,以及游戏开发中。

    图15-11帧解压缩(Frame Decompression Algorithm)算法的图示

    图 三个摄像机视图中的图像

    图 未最终渲染得到的“Leanne”角色

    图 经过最终渲染得到的“Leanne”角色

    图 E3 2006 Tigger Woods游戏demo中,伍兹标志性的笑容的出色捕捉复现

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch15.html

     

    第16章 Crysis 中植被的程序化动画和着色(Vegetation Procedural Animation and Shading in Crysis)

    【关键词】

    • 植被过程化动画(Vegetation Procedural Animation)

    • 植被着色(Vegetation Shading)

    • 孤岛危机(Crysis)

    • Cry Engine 2

    【内容盘点】

    这章阐述了如何以高效且具有真实感的方法处理着色和程序化植被动画。主要介绍了《孤岛危机(Crysis)》中植被的渲染以及程序化动画如何实现(基于Cry ENGINE 2)。本章中给出的程序化动画技术使用普通的方式实现,因此将风力实现于非植被对象(如衣服和头发)也是有可能的;唯一不同之处在于这些情况下不需要使用主弯曲(main bending)。文中的方法实现了直升机、手雷爆炸、武器火力对植被、衣服和头发的影响,在这些实现中均使用了极为高效的方法。

    内容方面,分为程序化动画(Procedural Animation)和植被着色(Vegetation Shading)两部分。

    图 顶点色的使用

    图 次表面纹理贴图

    图 边缘平滑

    图 最终渲染结果【左:没有使用动态范围、阴影和后处理的结果;右:使用了所有技术的结果】

    不得不说的是,2007年11月面世的《孤岛危机(Crysis)》,已经过了10周岁,其渲染效果放到今天,依然很能打:

    图 植被渲染效果图 @Crysis @2007

    图 植被渲染效果图 @Crysis @2007

    图 植被渲染效果图 @Crysis @2007

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch16.html

     

    第17章 鲁棒的多镜面反射和折射(Robust Multiple Specular Reflections and Refractions)

    【关键词】

    • 多镜面反射(Multiple Specular Reflections)

    • 多折射(Multiple Refractions)

    • 层次化距离图(Layered Distance Maps)

    【内容盘点】

    本章中,给出了一个鲁棒的算法来计算GPU中的单个和多个反射和折射。

    为了使片段着色器能够在查找辅助光线的交点时访问整个场景的几何描述,文中首先将场景渲染为层次化距离图(layer distance map)。

    图 具有3 + 1层的分层距离图

    图 以方位来追踪射线

    每个层在纹理内存中被存储为一个立方体贴图(cube map)。算法基于搜索来辅助光线追踪。搜索过程从光线遍历开始,这样保证不会漏掉任何光线与屏幕的交点,继而进行割线搜索(secant serch)以保证精确性。

    相比于直接实现经典的光线跟踪方法,使用光栅化的几何体表示中跟踪光线方法的一个重要优点,是这些方法可以被整合到当前的游戏引擎中,可以利用游戏开发中的可见性算法,并使用当时最新显卡的全部潜能。

    图 茶壶单次和多次反射的结果。【图(a)最多一次反射,50/100 FPS 图(b) 最多两次反射36/80 FPS,(c)最多三次反射 30/60 FPS】

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch17.html

     

    第18章 用于浮雕映射的松散式锥形步进(Relaxed Cone Stepping for Relief Mapping)

    【关键词】

    • 浮雕映射(Relief Mapping)

    • 松散式锥形步进(Relaxed Cone Stepping)

    • 锥形步进映射(Cone step mapping ,CSM)

    【内容盘点】

    本章中,描述了一个用于逐片段的置换映射的新的光线场相交(ray-height-field intersection)策略,其结合了锥形步进映射和二分查找两者的优点。

    文章将这种新的空间跳跃(space-leaping)算法命名为松散式锥形步进(Relaxed Cone Stepping, RCS),这是由于其消除了在锥形步进映射(Cone step mapping ,CSM)中对锥形半径定义的限制。而光场相交的思想是使用一个一个改进的space-leaping技术替代线性查找,其后立刻接一个二分查找。

    图 锥形步进映射(Cone step mapping ,CSM)

    图 不同深度和tiling因子对外观的影响的图示

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch18.html

     

    第19章 《Tabula Rasa》中的延迟着色(Deferred Shading in Tabula Rasa)

    【关键词】

    • 延迟着色(Deferred Shading)

    • 前向着色(Forward Shading)

    • 体积光(Light Volumes)

    • 可读深度(Readable Depth)

    • 法线缓存(Normal Buffer)

    • 双向光照(Bidirectional Lighting)

    • 球体映射(Globe Mapping)

    • 盒式光照(Box Lights)

    • 阴影贴图(Shadow Maps)

    • 高效光照体(Efficient Light Volumes)

    • 模板掩码(Stencil Masking)

    • 动态分支(Dynamic Branching)

    【内容盘点】

    图《Tabula Rasa》封面图

    这章内容关于延迟着色,承接了《GPU Gem2》中的《S.T.A.L.K.E.R中的延迟着色》一文,是对其内容的延伸。相较于《S.T.A.L.K.E.R中的延迟着色》,这章着重于介绍基于延迟渲染的引擎中所需要的高层次问题、技术以及解决方法。

    文中提到延迟着色的主要缺点包括:

    • 高内存带宽的使用

    • 没有硬件抗锯齿

    • 缺乏合适的对透明度混合的支持。

    而延迟着色的主要有点包括:

    • 光照计算的消耗与场景复杂度无关

    • 着色器能够对深度及其他像素信息进行访问

    • 每个像素仅被每个光照亮一次。即,若像素后来被其他不透明几何体所遮挡,其上便不会有光照计算。

    • 清晰分布的着色器代码:材质渲染从光照计算中分开

    该章中讲到了一些可以在前向或者延迟着色引擎中实现的高级光照特性,包括双向光照(Bidirectional Lighting)、球体映射(Globe Mapping),盒式光照(Box Lights)、阴影贴图(Shadow Maps)等技术。

    延迟渲染的优化方面,讲到了高效光照体积(Efficient Light Volumes)、模板掩码(Stencil Masking)以及动态分支(Dynamic Branching)等内容。

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch19.html

     

    第20章 基于GPU的重要性采样(GPU-Based Importance Sampling)

    【关键词】

    • 渲染方程(Rendering Formulation)

    • 基于GPU的重要性采样(GPU-Based Importance Sampling)

    • 蒙特卡洛积分(Monte Carlo quadrature)

    • 拟随机低差异序列(Quasirandom Low-Discrepancy Sequences)

    • mipmap

    【内容盘点】

    高动态范围(High-Dynamic-Range ,HDR),结合环境贴图预过滤技术(Environment map prefiltering techniques)(Kautz et al. 2000),以及结合使用小波(wavelets)(Wang et al. 2006)或球面调和函数(spherical harmonics)(Ramamoorthi and Hanrahan 2002)的频空间解决方案,为实时渲染提供了可行的思路。然而,这种方式过于呆板,因为需要大量的预计算或繁多的代码用于光滑表面反射。

    这章给出了上述方案的一种替代技术——基于GPU的重要性采样(GPU-Based Importance Sampling),该技术基于蒙特卡罗积分对光滑对象使用基于图像的光照,采用该技术仅需要很少的预计算,并在单个GPU着色器中运算。因此合适于几乎所有需要实时动态改变材质或光照的管线。

    图 每像素40个样本的重要性采样

    图 过滤重要性采样示意图

    图 对斯坦福兔子使用逐像素40次采样的实时渲染效果。

    图 空间变化的BRDF(Spatially Varying BRDF)设计器

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch20.html

     

    第四部分 图像效果(Image Effects)

     

    第21章 真实Impostor(True Impostors)

    【关键词】

    • Billboard

    • impostor

    • 半透明impostor (Translucence impostor)

    【内容盘点】

    这章给出了 “真实impostor(ture imposters)”方法,这是一种向任意场景中加入大量简单模型而不需要渲染大量多边形的方法。这种方法使用了现代着色硬件来执行光线发射到已定义的纹理体积中,且表示非高度场表面数据的多深度层与四边形相关。

    如同传统的imposter方法,ture imposter方法将四边形沿其中心渲染使其总是朝向摄像机。而与传统的显示静态纹理的imposter技术不同,真实imposter技术使用像素着色器发射一个观察光线穿过四边形的纹理坐标空间,与3D模型相交并计算相交点处的颜色。而纹理坐标空间通过一个以四边形中心为原点的框架定义。

    图 生成公告板

    图 真实imposter投影的多边形

    图 投射视图光线拍摄2D切片

    图 基于射线步进(Ray March)和二分搜索确定体积交点

    真imposter支持模型上的自阴影、反射以及折射,是一个查找体积间距离的有效方法。且文中基于相交测试的扩展,也对半透明效果进行了支持。

    图 扩展相交测试以支持半透明

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch21.html

     

    第22章 在GPU上烘焙法线贴图(Baking Normal Maps on the GPU)

    【关键词】

    • 法线贴图烘焙(Baking Normal Maps)

    • 均匀网格(Uniform Grid)

    【内容盘点】

    这章分析了传统的基于光线投射的法线贴图投影技术如何在GPU上成功地实现,还阐述了一些其中普遍存在的问题,例如,内存限制和反走样。

    而对文中实现的技术进行一些微小的改动,就可以生成位移贴图(displacement mapping),以及视差贴图(parallax mapping)和浮雕贴图(relief mapping)。而使用更加复杂的着色器,还可以生成局部环境光遮蔽(local ambient occlusion)或腔贴图(cavity maps)。且这种技术的一个优点是可以足够快递显式地单独渲染所有mip等级。

    图 映射到GPU的数据的可视化表示

    图 最终在GPU上生成的法线贴图及其对应模型

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch22.html

     

    第23章 高速的离屏粒子(High-Speed, Off-Screen Particles)

    【关键词】

    • 粒子系统(Particle System)

    • 离屏粒子(Off-Screen Particle)

    • 深度降采样(Downsampling Depth)

    【内容盘点】

    粒子效果在游戏中随处可见,大量粒子系统普遍用于烟、火、爆炸、沙尘、和雾。然而若这些粒子填满了屏幕,过度绘制(overdraw)可能几乎会达到无限,并且通常会导致帧速率问题。

    文章提出的解决方案是,将昂贵的粒子渲染到离屏(off-screen)的渲染目标中,而这个渲染目标的大小是帧缓冲区大小的一小部分。这可以在过度绘制(overdraw)中产生巨大的开销节省,但是会牺牲一些图像处理的开销。

    而结果显示,低分辨率的离屏渲染可以带来巨大的性能提升,它有助于使粒子系统耗费更加可控,因此帧速率并不会在过度绘制的最坏的情况下成为性能问题。

    图 基本离屏算法的步骤【(a)仅固体对象 (b)仅在低分辨率、离屏渲染对象中的粒子 (c)结合后的场景】

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch23.html

     

    第24章 保持线性的重要性(The Importance of Being Linear)

    【关键词】

    • 颜色空间(Color Space)

    • 线性空间(Linear Space)

    • 伽马空间(Gamma Space)

    • 伽马校正(Gamma Correction)

    【内容盘点】

    这章讲到,OpenGL、DirectX以及任何我们书写的着色器,会将所有的纹理输入、光照/材质交互,以及输出当做线性(即、光照强度和,漫反射乘积)来执行数学运算。但假如我们的纹理输入是非线性的,并且用户使用了未校准及未修正的显示器来应用非线性颜色空间变换。而这样会导致各种形式的失真和不精确等问题(如mipmap过滤错误)以及一些粗糙错误(如及不正确的光照渐变)。而适当的gamma修正可能是最简单,花费最小,也是最广泛使用的技术。而为了让读者规避这些问题,文中给出了一系列的解决方法与建议。

    值得一提的是,目前流行的基于物理的渲染若要得到正确精准的渲染结果,正是需要在线性空间下进行。

    图 显示器的典型响应曲线

    图 使用合适的gamma校正(左侧)及不进行gamma校正的渲染(右侧)图

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch24.html

     

    第25章 在GPU 上渲染矢量图(Rendering Vector Art on the GPU)

    【关键词】

    • 矢量(Vector)

    • 二次条样(Quadratic Splines)

    • 三次贝塞尔曲线(cubic Bezier curves)

    【内容盘点】

    矢量(Vector)表示为指定形状的一种分辨率无关的方法,其具有任意大小,可以对内容进行显示而不需要细化(tessellation)以及没有采样失真的优点。

    这章给出了一个算法,用于渲染由封闭路径所定义的向量图形,而封闭路径可以包含二次样条(Quadratic Splines)或三次贝塞尔曲线(cubic Bézier curves)。

    图 所有参数立方平面曲线可归类为此三种曲线类型之一的某些段的参数化

    图 渲染二次样条曲线

    图 渲染三次样条【(a)有向的多轮廓三次样条输入、(b)每个贝塞尔凹包被局部地三角化;内侧区域被全局地三角化;(c)内部三角形被填充,曲线段使用一个特殊的像素着色器程序渲染】

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch25.html

     

    第26章 通过颜色进行对象探测:使用 GPU 进行实时视频图像处理(Object Detection by Color: Using the GPU for Real-Time Video Image Processing)

    【关键词】

    • 对象探测(Object Detection)

    • 图像处理(Image Processing)

    【内容盘点】

    严格意义上并非游戏开发相关,略。

    本章英文全文链接:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch26.html

     

    第27章 后处理效果:运动模糊(Motion Blur as a Post-Processing Effect)

    【关键词】

    • 运动模糊(Motion Blur)

    • 后处理(Post-Processing Effect)

    【内容盘点】

    在视频游戏中,模拟速度最好的方法之一便是使用运动模糊(Motion Blur)。这章中阐述了一种使用在深度缓存中的深度值来计算对象世界空间位置的以实现运动模糊的方法,该方法可以作为一个基础方法使用,并且可以很轻易地整合到游戏引擎中,同时提供了比传统的多路径方法更高的性能。

    图 不具有运动模糊的场景

    图 使用了运动模糊的场景

    图 有无运动模糊的对比

    图 《神秘海域4》中的运动模糊

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch27.html

     

    第28章 实用景深后期处理(Practical Post-Process Depth of Field)

    【关键词】

    • 景深(Depth of Field,DoF)

    • 后处理(Post-Processing Effect)

    【内容盘点】

    景深(Depth of field,DOF),也叫焦点范围(focus range)或有效焦距范围(effective focus),是指场景中最近和最远的物体之间出现的可接受的清晰图像的距离。

    这章中阐述了一个景深(Depth of Field,DoF)算法,该算法主要适合于FPS游戏,最初使用于《使命召唤:现代战争》中。完整的算法包含以下4个阶段:

    1、对前进对象的散光圈进行降采样。

    2、模糊临近的散光圈图像。

    3、通过模糊后和未模糊的图像计算实际前景散光圈。

    4、在一个最后的全屏处理路径中使用可变宽度模糊,并在其中应用前景和背景散光圈图像。

    几张带景深的渲染效果,取最近几年的一些引擎和游戏截图。

    图 CryEngine3 中有无景深的渲染对比(有景深)

    图 CryEngine3 中有无景深的渲染对比(无景深)

    图 《地平线:黎明》中的景深

    本章英文原书全文传送门:

    https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch28.html

     

    【GPU精粹三部曲】 Part I • 完结

    这篇文章至此,GPU精粹三部曲中《GPU Gems》、《GPU Gems 2》、《GPU Gems3》组成的第一部曲,也就告一段落了。

     

    通过【GPU精粹与Shader编程】系列的这前7篇文章,我们已经将这三本书中的重点内容,全都过了一遍。希望各位读者能因此有所收获。

    下篇文章,将开启全新的《GPU Pro》系列。

    再会。

    展开全文
  • GPU Gems 2

    热门讨论 2009-03-05 10:34:24
    本书由引领全球计算机图形芯片技术发展的NVIDIA公司组稿,...本书主要基于当今图形处理器(GPU)的可编程图形管线,除了讲述创建高级视觉效果的基础知识和性能优化技术外,还着重介绍了前沿开发者们总结出来的快速技巧。
  • 系列文章前言《GPU Gems》1~3 、《GPU Pro》1~7 以及《GPU Zen》组成的饕餮盛宴,共11本书,合称“GPU精粹三部曲“,是游戏开发、计算机图形学和渲染领域的业界顶尖大牛们一线经验的合辑汇编...


    本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处  

    文章链接: https://zhuanlan.zhihu.com/p/36499291



    题图背景来自《神秘海域4》。


    系列文章前言


    《GPU Gems》1~3 、《GPU Pro》1~7 以及《GPU Zen》组成的饕餮盛宴,共11本书,合称“GPU精粹三部曲“,是游戏开发、计算机图形学和渲染领域的业界顶尖大牛们一线经验的合辑汇编,是江湖各大门派武林绝学经典招式的精华荟萃,是了解业界各种高阶知识和技法Trick,将自己的游戏开发、图形学与渲染能力提升到下一个高度的捷径。



    本文内容概览与关键词


    本篇文章将总结提炼“GPU精粹三部曲“11本书中的第一本《GPU Gems 1》全书的核心内容的下半部分,是【GPU精粹与Shader编程】系列文章正篇的第二篇,全文共1万5千余字。

    本文内容的关键词:

    • 真实感皮肤渲染(Realistic Skin Rendering)
    • 次表面散射(Subsurface Scattering)
    • 环境光遮蔽(Ambient Occlusion)
    • 实时辉光(Real-Time Glow)
    • 阴影的渲染(Shadow Rendering)
    • 透视阴影贴图(Perspective Shadow Maps)
    • 逐像素光照的可见性管理(Managing Visibility for Per-Pixel Lighting)
    • 空间BRDF(Spatial BRDFs)
    • 基于图像的光照(Image-Based Lighting,IBL)
    • 纹理爆炸(Texture Bombing)
    • 颜色控制(Color Controls)
    • 景深 (Depth of Field)
    • 高品质的图像滤波(High-Quality Filtering)
    • 快速滤波宽度的计算(Fast Filter-Width Estimates )
    • 高动态范围(High-Dynamic-Range , HDR)


    本文的GitHub版本


    不少朋友们喜欢看GitHub版本的文章,我也很喜欢。

    首先,MarkDown可以很方便地插入快捷导航目录,能进行瞬间跳转到指定子章节。其次,GitHub版本的文章中没有单篇文章的字数限制,少了很多篇幅方面的桎梏。而且因为Git的便利性,版本管理的优势,最新的勘误和修订第一时间会在GitHub的Repo中进行。

    【本文的GitHub版本传送门】:

    QianMo/Game-Programmer-Study-Notes



    目录 · 核心内容导航Highlight


    【说明】下文目录中加粗的标题为本文将包括的内容,非加粗的标题已在上次的更新(GPU
    Gems 1》全书核心内容提炼总结 · 上篇)中发布。

    另外需要注意,本文将原来在上篇中目录为次核心内容的“二十一、实时辉光(Real-Time
    Glow)”提升为了主核心内容,现为“六、实时辉光(Real-Time Glow)”。


    本文将进行重点提炼总结的主核心内容有:

    • 一、用物理模型进行高效的水模拟(Effective Water Simulation from Physical
      Models)
    • 二、Dawn Demo中的皮肤渲染(Skin in the Dawn Demo)
    • 三、无尽波动的草地叶片的渲染(Rendering Countless Blades of Waving Grass)
    • 四、次表面散射的实时近似(Real-Time Approximations to Subsurface Scattering)
    • 五、环境光遮蔽(Ambient Occlusion)
    • 六、实时辉光(Real-Time Glow)

    本文将进行提炼总结的次核心内容有:

    • 七、水焦散的渲染 (Rendering Water Caustics)
    • 八、 Dawn Demo中的动画(Animation in the "Dawn" Demo)
    • 九、 改良的Perlin噪声实现(Implementing Improved Perlin Noise)
    • 十、Vulcan Demo中的火焰渲染(Fire in the "Vulcan" Demo)
    • 十一、衍射的模拟(Simulating Diffraction)
    • 十二、高效的阴影体渲染(Efficient Shadow Volume Rendering)
    • 十三、电影级光照(Cinematic Lighting)
    • 十四、阴影贴图抗锯齿(Shadow Map Antialiasing)
    • 十五、全方位阴影映射(Omnidirectional Shadow Mapping)
    • 十六、使用遮挡区间映射产生模糊的阴影(Generating Soft Shadows Using Occlusion Interval Maps)
    • 十七、透视阴影贴图(Perspective Shadow Maps: Care and Feeding)
    • 十八、逐像素光照的可见性管理(Managing Visibility for Per-Pixel Lighting)
    • 十九、空间BRDF(Spatial BRDFs)
    • 二十、基于图像的光照(Image-Based Lighting)
    • 二十一、纹理爆炸(Texture Bombing)
    • 二十二、颜色控制(Color Controls)
    • 二十三、景深 (Depth of Field)
    • 二十四、高品质的图像滤波(High-Quality Filtering)
    • 二十五、用纹理贴图进行快速滤波宽度的计算(Fast Filter-Width Estimates with Texture Maps)
    • 二十六、OpenEXR图像文件格式与HDR(The OpenEXR Image File Format and HDR)

    PS : 因为知乎专栏单篇文章字数限制在1万5千字的原因,本文的“第二部分 · 次核心内容提炼总结”中所有小结的【本章配套源代码汇总表】子栏目,以及参考文献,将在下文中略去。需要查看这些额外内容的同学,请移步至本文的GitHub版本:

    QianMo/Game-Programmer-Study-Notes



    《GPU Gems 1》配套资源与源代码


    这一节提供了一些,《GPU Gems 1》书本的相关链接,以及配套源代码的下载。

    PS:配套的不少工程中不仅包含完整的源码,也直接包含经过编译后的exe执行文件,可以直接运行后查看效果。

    • 原书全文的Web版本:

    developer.nvidia.com/gpugems/GPUGems/gpugems_pref01.html

    • 我维护了的一个名为“GPU-Gems-CD-Content”的GitHub仓库,并整理好了《GPU Gems》1~3 书本全部的配套工程与源代码,逐章内容的快捷导航,以备份、珍贵、快速查阅这些优质资源:

    github.com/QianMo/GPU-Gems-Book-Source-Code



    第一部分 · 主核心内容提炼总结



    四、次表面散射的实时近似(Real-Time Approximations to Subsurface Scattering)


    【章节概览】


    次表面散射(Subsurface Scattering),简称SSS,或3S,是光射入非金属材质后在内部发生散射,最后射出物体并进入视野中产生的现象,即光从表面进入物体经过内部散射,然后又通过物体表面的其他顶点出射的光线传递过程。


                                                                               图 次表面散射原理图示


    图 真实世界中的次表面散射


    要产生使人信服的皮肤和其他半透明材质的渲染效果,次表面散射(Subsurface Scattering)的渲染效果十分重要。


    图 有无次表面散射的皮肤渲染对比图(左图:使用次表面散射 | 右图:无次表面散射)


    另外需要提出,在《神秘海域4》中皮肤的渲染效果,很令人惊艳。当然,《神秘海域4》中令人惊艳的,远远不止皮肤的渲染。

    图 基于次表面散射的皮肤渲染 @《神秘海域4》


    本章即描述了次表面散射的几种实时近似方法,关于皮肤的渲染,也关于近似地去模拟透明材质的几种不同方法。


    【核心内容提炼】


    4.1 次表面散射的视觉特性(The Visual Effects of Subsurface Scattering)


    要重现出任何视觉效果,经常的做法是考察这种效果的图像,并把可视的外观分解为其组成要素。在观察半透明物体的相片和图像时,能注意到如下几点,即次表面散射(Subsurface
    Scattering)的视觉特性:

    1、首先,次表面散射往往使照明的整体效果变得柔和。

    2、一个区域的光线往往渗透到表面的周围区域,而小的表面细节变得看不清了。

    3、光线传入物体越深,就衰减和散射得越严重。

    4、对于皮肤来说,在照亮区到阴影区的衔接处,散射往往会引起微弱的倾向于红色的颜色偏移。这是由于光线照亮表皮并进入皮肤,接着被皮下血管和组织散射和吸收,然后从阴影部分离开。且散射在皮肤薄的部位更加明显,比如鼻孔和耳朵周围。


                                                                           图 次表面散射原理图示


    4.2 简单的散射近似(Simple Scattering Approximations)


    近似散射的比较简单技巧是环绕照明(Warp Lighting)。正常情况下,当表面的法线对于光源方向垂直的时候,Lambert漫反射提供的照明度是0。而环绕光照修改漫反射函数,使得光照环绕在物体的周围,越过那些正常时会变黑变暗的点。这减少了漫反射光照明的对比度,从而减少了环境光和所要求的填充光的量。环绕光照是对Oren-Nayar光照模型的一个粗糙的近似。原模型力图更精确地模拟粗糙的不光滑表面(Nayar and Oren 1995)。

    下图和代码片段显示了如何将漫反射光照函数进行改造,使其包含环绕效果。

    其中,wrap变量为环绕值,是一个范围为0到1之间的浮点数,用于控制光照环绕物体周围距离。

    图 环绕光照函数的图表

    float diffuse = max(0, dot(L, N));
    
    float wrap_diffuse = max(0, (dot(L, N) + wrap) / (1 + wrap));
    


    为了在片元函数程序中的计算可以更加高效,上述函数可以直接编码到纹理中,用光线矢量和法线的点积为索引。

    而在照明度接近0时,可以显示出那种倾向于红的微小颜色漂移,这是模拟皮肤散射的一种廉价方法。而这种偏向于红色的微小颜色漂移,也可以直接加入到此纹理中。

    另外也可以在此纹理的alpha通道中加入镜面反射高光光照的功率(power)函数。可以在示例代码Example 16-1中的FX代码展示了如何使用这种技术。对比的图示如下。

                              图 (a)没有环绕光照的球体 (b)有环绕光照明的球体 (c)有环绕光照明和颜色漂移的球体

    Example 16-1 摘录纳入了环绕照明的皮肤Shader效果的代码(Excerpt from the Skin
    Shader Effect Incorporating Wrap Lighting)

    // 为皮肤着色生成2D查找表(Generate 2D lookup table for skin shading)
    
    float4 GenerateSkinLUT(float2 P : POSITION) : COLOR
    
    {
    
        float wrap = 0.2;
    
        float scatterWidth = 0.3;
    
        float4 scatterColor = float4(0.15, 0.0, 0.0, 1.0);
    
        float shininess = 40.0;
    
        float NdotL = P.x * 2 - 1; // remap from [0, 1] to [-1, 1]
    
        float NdotH = P.y * 2 - 1;
    
        float NdotL_wrap = (NdotL + wrap) / (1 + wrap); // wrap lighting
    
        float diffuse = max(NdotL_wrap, 0.0);
    
        // 在从明到暗的转换中添加颜色色调(add color tint at transition from light to
        dark)
    
        float scatter = smoothstep(0.0, scatterWidth, NdotL_wrap) *
    
        smoothstep(scatterWidth * 2.0, scatterWidth,
    
             NdotL_wrap);
    
        float specular = pow(NdotH, shininess);
    
        if (NdotL_wrap <= 0) specular = 0;
    
        float4 C;
    
        C.rgb = diffuse + scatter * scatterColor;
    
        C.a = specular;
    
        return C;
    
    }
    
    // 使用查找表着色皮肤(Shade skin using lookup table)
    
    half3 ShadeSkin(sampler2D skinLUT,
    
        half3 N,
    
        half3 L,
    
        half3 H,
    
        half3 diffuseColor,
    
        half3 specularColor) : COLOR
    
    {
    
        half2 s;
    
        s.x = dot(N, L);
    
        s.y = dot(N, H);
    
        half4 light = tex2D(skinLUT, s * 0.5 + 0.5);
    
        return diffuseColor * light.rgb + specularColor * light.a;
    
    }
    


    4.3 使用深度贴图模拟吸收(Simulating Absorption Using Depth Maps)


    吸收(Absorption)是模拟半透明材质的最重要特性之一。光线在物质中传播得越远,它被散射和吸收得就越厉害。为了模拟这种效果,我们需要测量光在物质中传播的距离。而估算这个距离可以使用深度贴图(Depth Maps)技术[Hery 2002],此技术非常类似于阴影贴图(Shadow Mapping),而且可用于实时渲染。

                                                                      图 使用深度贴图计算光在物体中的传播的距离

    深度贴图(Depth Maps)技术的思路是:

    在第一个通道(first pass)中,我们从光源的视点处渲染场景,存储从光源到某个纹理的距离。然后使用标准的投射纹理贴图(standard projective texture mapping),将该图像投射回场景。在渲染通道(rendering pass)中,给定一个需要着色的点,我们可以查询这个纹理,来获得从光线进入表面的点(di)到光源间距离,通过从光线到光线离开表面的距离(do)里减去这个值,我们便可以获得光线转过物体内部距离长度的一个估计值(S)。如上图。

    原文中详细分析了此方法的实现过程,也附带了完整的Shader源码,具体细节可以查看原文,这里因为篇幅原因就不展开了。

                                                    图 使用深度贴图去近似散射,物体上薄的部位传输更多的光

    也有一些更高端的模型试图更精确地模拟介质内散射的累积效应。

    一种模型是单次散射近似(Single Scattering Approximation),其假设光在材质中只反弹一次,沿着材质内的折射光线,可以计算有多少光子会朝向摄像机散射。当光击中一个粒子的时候,光散射方向的分布用相位函数来描述。而考虑入射点和出射点的菲涅尔效应也很重要。

    另一种模型,是近似漫反射(Diffusion Approximation),其用来模拟高散射介质(如皮肤)的多次散射效果。



    4.4 纹理空间的漫反射(Texture-Space Diffusion)


    次表面散射最明显的视觉特征之一是模糊的光照效果。其实,3D美术时常在屏幕空间中效仿这个现象,通过在Photoshop中执行Gaussian模糊,然后把模糊图像少量地覆盖在原始图像上,这种“辉光”技术使光照变得柔和。

    而在纹理空间中模拟漫反射[Borshukov and Lewis 2003],即纹理空间漫反射(Texture-Space Diffusion)是可能的,我们可以用顶点程序展开物体的网格,程序使用纹理坐标UV作为顶点的屏幕位置。程序简单地把[0,1]范围的纹理坐标重映射为[-1,1]的规范化的坐标。

    另外,为了模拟吸收和散射与波长的相关的事实,可以对每个彩色通道分为地改变滤波权重。

                                           图 (a)原始模型 (b)应用了纹理空间漫反射照明的模型,光照变得柔和


                                                                            图 基于纹理空间漫反射照明的效果

    同样,原文中详细分析了此方法的实现过程,也附带了完整的Shader源码,具体细节可以查看原文,这里因为篇幅原因就不展开了。


    再贴几张基于次表面散射的皮肤渲染效果图,结束这一节。


                                                                            图 基于次表面散射的皮肤渲染


                                                              图 基于次表面散射的皮肤渲染 @《神秘海域4》


                                                                    图 基于次表面散射的皮肤渲染 @《神秘海域4》

    【核心要点总结】


    文中提出的次表面散射的实时近似方法,总结起来有三个要点:

    1) 基于环绕照明(Warp Lighting)的简单散射近似,Oren-Nayar光照模型。

    2) 使用深度贴图来模拟半透明材质的最重要特性之一——吸收(Absorption)。

    3)基于纹理空间中的漫反射模拟(Texture-Space Diffusion),来模拟次表面散射最明显的视觉特征之一——模糊的光照效果。



    【本章配套源代码汇总表】


    Example 16-1 摘录纳入了环绕照明的皮肤Shader效果的代码(Excerpt from the Skin Shader Effect Incorporating Wrap Lighting)

    Example 16-2 深度Pass的顶点Shader代码(The Vertex Program for the Depth Pass)

    Example 16-3 深度Pass的片元Shader代码(The Fragment Program for the Depth Pass)

    Example 16-4 使用深度贴图来计算穿透深度的片元Shader代码(The Fragment Program Function for Calculating Penetration Depth Using Depth Map)

    Example 16-5 用于展开模型和执行漫反射光照的顶点Shader代码(A Vertex Program to Unwrap a Model and Perform Diffuse Lighting)

    Example 16-6 用于漫反射模糊的顶点Shader代码(The Vertex Program for Diffusion Blur)

    Example 16-7 用于漫反射模糊的片元Shader代码(The Fragment Program for Diffusion Blur)


    【关键词提炼】


    皮肤渲染(Skin Rendering)

    次表面散射(Subsurface Scattering)

    纹理空间漫反射(Texture-Space Diffusion)

    环绕照明(Warp Lighting)

    深度映射(Depth Maps)




    五、环境光遮蔽(Ambient Occlusion)



    【章节概览】


    在某种意义上,这篇文章属于环境光遮蔽的启蒙式文章。

    环境光遮蔽(Ambient Occlusion),简称AO,是一种用于计算场景中每个点对环境光照的曝光程度的一种着色渲染技术。

    本章讲到了如何使用有效的实时环境光遮蔽技术,对物体遮蔽信息及环境进行预处理,综合这些因素给物体创建逼真的光照和阴影。

                                                                              图 有无环境光遮蔽的对比

                                                                              图 有无环境光遮蔽的对比


    【核心内容提炼】


    5.1 概述


    首先,本文中讲到,环境光遮蔽(Ambient Occlusion)一般而言有两种理解:

    1)将环境光遮蔽视为“智能”的环境光项,其在模型表面的变化取决于在每点可见多少外部环境。

    2)将环境光遮蔽视为一个漫反射项,其能有效地支持复杂分布的入射光线。


    文中将考虑上述的第二种解释。

    其基本思路是,假如预处理一个模型,计算它上面每个点可以看到多少外部环境,可以相反地计算有多少环境被模型的其他部分遮挡,然后在渲染时使用这个信息计算漫反射着色项的值。其结果是模型上的裂缝变暗,而模型的暴露部分会接收更多的光线,因此更明亮。这种效果实质上比使用标准的着色模型更逼真。

    另外,这个方法可以扩展为使用环境光作为照明源,用代表各个方向入射光的环境贴图没来决定物体上每个点光的颜色。为了这个特性,除了记录在点上可以看到多少外部环境之外,也记录大部分可以光从哪个方向到达。这两个量有效地定义了从外面进入场景的未被遮挡的方向圆锥体,可以一起用来做为来自环境贴图的极端模糊的查询,模拟着色点上来自感兴趣的方向圆锥体的全部入射照度。



    5.2 预处理步骤(The Preprocessing Step)


    给定一个任意的着色模型,环境光遮蔽算法需要知道模型上每点的两个信息:

    (1)该点的“可到达度(accessibility)”- 即该点上方半球的哪一部分未被模型的其他部分遮挡;

    (2)未被遮挡的入射光的平均方向。

    通过下图在平面上说明这两个概念。给定在表面上的点P,其法线为N,P点上半球的2/3被场景中其他几何体遮挡,半球另外的1/3不被遮挡。入射光的平均方向用B表示,其在法线N的右侧。大致来说,在P点的入射光的平均颜色,可以通过求围绕B矢量的未遮挡入射光的圆锥体的平均值得到。

                                                                              图 可到达度和平均方向的计算

    下面贴出的伪代码显示了我们的基本方法。在每个三角形的中心,我们产生一组以表面法线为中心的半球形光线,跟踪每道光线进入场景,记录哪些光线与模型相交,标志不能从环境接收的光线,以及不被遮挡的光线。接着我们计算不被遮挡的光线的平均方向,这给出了入射光平均方向的近似值。(当然,我们计算的方向实际上可能会被遮挡,但我们选择忽略不计这个问题。)

    Example 17-1 计算环境光遮蔽量的基本算法伪代码 (Basic Algorithm for Computing Ambient Occlusion Quantities)

    For each triangle {
    
        Compute center of triangle
    
        Generate set of rays over the hemisphere there
    
        Vector avgUnoccluded = Vector(0, 0, 0);
    
        int numUnoccluded = 0;
    
        For each ray {
    
            If (ray doesn't intersect anything) {
    
                avgUnoccluded += ray.direction;
    
                ++numUnoccluded;
    
            }
    
        }
    
        avgUnoccluded = normalize(avgUnoccluded);
    
        accessibility = numUnoccluded / numRays;
    
    }
    

    生成这些光线的简单方法是使用拒绝采样法(rejection sampling):检测在x,y和z为-1到1区间的3D立方体中随机生成的光线,并拒绝不在单位半球中与法线相关的光线。

    能通过这次检测的光线方向可视分布理想的光线方向。列表17-2的伪代码表示出了此方法的实现思路。

    当然,也可以用更复杂的蒙特卡洛(Monte Carlo)采样法来得到更好的样本方向的分布。

    Example 17-2 使用拒绝采样法计算随机方向的算法伪代码(Algorithm for Computing
    Random Directions with Rejection Sampling)

    while (true) {
    
        x = RandomFloat(-1, 1); // random float between -1 and 1
    
        y = RandomFloat(-1, 1);
    
        z = RandomFloat(-1, 1);
    
        if (x * x + y * y + z * z > 1) continue; // ignore ones outside unit
    
        // sphere
    
        if (dot(Vector(x, y, z), N) < 0) continue; // ignore "down" dirs
    
        return normalize(Vector(x, y, z)); // success!
    
    }
    

    另外,用图形硬件代替光线追踪软件,有可能加速遮挡信息的计算。



    5.3 使用环境光遮蔽贴图进行渲染(Rendering with Ambient Occlusion Maps)


    使用环境光遮蔽贴图进行着色的基本思想是:

    可以直接在着色点处使用之前已计算好的,有多少光线能到达表面的,优质的近似值信息。


    影响这个数值的两个因素是:

    (1)在此点上方半球的哪个部分不被点和环境贴图之间的几何体遮挡。

    (2)沿着这些方向的入射光是什么。


    下图显示了两种不同的情况。在左图中,只能看到着色点上面的一小部分分享,由方向矢量B和围绕它的方向圆锥体所表示,该点的可到达度非常低。而在右图中,沿着更大范围的方向有更多的光线到达给定点。


    图 不同量的可见度的近似(左图:由于附近的几何体的遮挡比较严重,这点得到的照度较小;右图:沿着更宽方向的圆锥体,更大量的光能到达这点,照度较左图更大)


    在预处理中计算的可访问性值告诉我们哪一部分半球可以看到环境贴图,而可见方向的平均值给出一个近似方向,围绕它计算入射光。虽然这个方向可能指向一个实际被遮挡的方向(例如,如果半球的两个独立区域未被遮挡,但其余的部分被遮挡,平均方向可能在这两者之间),但在实践中其通常运行良好。

                                                                图 使用可到达度信息和环境贴图渲染的光照场景

                                                             图 有无使用环境光遮蔽贴图进行渲染的对比图

    另外需要注意,实时环境光遮蔽的常用廉价方案是预先计算网格表面几个位置的平均可见性值,存储于贴图中,然后将这些值在运行时与图形硬件提供的未遮挡光照相乘。



    【核心要点总结】


    给定一个任意的着色模型,环境光遮蔽算法需要知道模型上每点的两个信息:

    1)该点的可到达度(accessibility)。

    2)未被遮挡的入射光的平均方向。


    文中提出的环境光遮蔽方法,总结起来有三个要点:

    • 采用了多种在实践中运行良好的近似方法。
    • 主要为预处理操作,将相对昂贵的计算事先准备好,且仅计算在渲染时进行快速着色所需的正确信息。
    • 预处理不依赖于光照环境贴图,因此可以轻松使用场景中的动态照明。


    【本章配套源代码汇总表】


    Example 17-1 计算环境光遮蔽量的基本算法伪代码(Basic Algorithm for Computing Ambient Occlusion Quantities)

    Example 17-2 使用拒绝采样法计算随机方向的算法伪代码(Algorithm for Computing Random Directions with Rejection Sampling)

    Example 17-3 使用可到达度和环境映射进行着色的片元Shader(Fragment Shader for Shading with Accessibility Values and an Environment Map)

    Example 17-4 latlong( )函数的定义(The latlong() Function Definition)

    Example 17-5 computeBlur( )函数的定义(The computeBlur() Function Definition)



    【关键词提炼】


    环境光遮蔽(Ambient Occlusion)

    拒绝采样(Rejection Sampling)

    环境光遮蔽贴图(Ambient Occlusion Maps)





    六、实时辉光(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)





    二十四、高品质的图像滤波(High-Quality Filtering)


    【章节概览】


    这章描述了图像滤波和可以用于任意尺寸图像的效果,并将各种不同的滤波器核心(kernel),在分析计算后应用于各式2D和3D反走样问题中。


    【核心要点】


    GPU可以提供一些快速滤波的访问纹理的方法,但是仅限于几种类型的纹理过滤,并不是对每种纹素格式都适用。若我们自己建立自己的图像滤波方法,可以得到更好的质量和灵活性,但需要了解硬件和程序滤波之间存在的质量和速率的矛盾。
    对滤波图像所考虑的内容也同样适用于3D渲染,尤其是把模型纹理化(光栅化)的时候,即把3D数据(和潜在的纹理信息)转换为一个新的2D图像的时候。
    而混合过滤方法(Hybrid filtering approaches)可以提供一个最佳的中间路径,即借助硬件纹理单元解析的着色。
    GPU着色程序不同于CPU的主要之处在于:一般来说,CPU数学操作比纹理访问更快。在像RenderMan这样的着色语言中,texture()是最费时的操作之一,而在GPU中的情形恰恰相反。
    图像滤波( image filtering)的目的很简单:对于给定的输入图像A,我们想要创建新的图像B,把源图像A变换到目标图像B的操作就是图像滤波。最一般的变换是调整图像的大小、锐化、变化颜色,以及模糊图像等操作。
    源像素的模式,以及它们对图像B像素的相对共享,就称为滤波的核心(filter kernel)。而把核心御用到源图像的过程叫做卷积(convolution):即使用特殊的核心卷积源图像A的像素,创建新图像B的像素。
    如果核心只是把像素简单地进行平均,我们称这个模型为盒式滤波器(box filter),因为模型是一个简单的长方形(所有像素都在盒中)。每个采样的纹素(即,从纹理来的一个像素)的权重相等。盒式滤波器很容易构造,运行速度快,是GPU中硬件驱动过的一种滤波核心。
    如果我们正好使用小的核心,可以把它作为参数直接代入Shader,下图显示的样本代码执行3 x 3的滤波运算,对编入索引的纹素和其临近单元,赋予W00到W22的加权值,先求加权和,然后除以预计算的总和值(Sum)把它们重规范化。
    图 中心在W11的3x3滤波核心的像素布局
    我们可以自己定义各种核心,如可以基于两个常数的3 x 3核心做边缘检测,后文也接着讲到了双线性滤波核心(Bilinear Kernel),双立方滤波核心(Bicubic Filter Kernel),屏幕对齐的核心(Screen-Aligned Kernels)等内容。
    图 双线性和双立方滤波的效果
    (题外话:不知道为什么,看这个小男孩,莫名觉得长得像冠希哥……)
    (a)原始图像,注意眼睛上方的长方形。(b)用线性滤波把矩形的子图像区域放大32倍;(c)用双立方滤波把相同的区域放大32倍。

    【关键词提炼】


    高品质图像滤波(High-Quality Filtering)
    边缘检测(Edge Detection)
    双线性滤波(Bilinear Filtering)
    双三次滤波(Bicubic Filtering)
    三次滤波(Cubic Filtering)


    二十五、用纹理贴图进行快速滤波宽度的计算(Fast Filter-Width Estimates with Texture Maps)


    【章节概览】

    这章描述基于纹理映射在2D空间中进行快速过滤宽度计算(Fast Filter-WidthEstimates)的方法。即使硬件profile对复杂函数的局部偏导函数不提供直接支持,基于本文提出的纹理操作技巧,也可以得到结果。

    【核心要点】

    Cg标准库提供了ddx()和ddy()函数,计算任意量关于x和y像素的导数。换言之,调用ddx(v),可以求出变量v在x方向的当前像素与下一个像素之间的变化量,调用ddy(v)同样也可以求出y方向的情况。
    那么,下面贴出的这个filterwidth()函数,可以很容易地计算任何值在像素之间变化的速率,以及程序纹理说需要过滤的面积。
    
    
    float filterwidth(float2 v)
    {
         float2 fw = max(abs(ddx(v)), abs(ddy(v))); 
         return max(fw.x, fw.y);
    }
    上述filterwidth()函数,仅在支持ddx()和ddy()函数的profile下工作,但可惜的是一些硬件profile不支持这两两个函数。而本文提出的这个trick,可以使用纹理映射硬件,进行与filterwidth()函数本质上相同的运算。
    而这个技巧的关键在于,用函数tex2D()所做的纹理贴图查询,可以自动地对纹理查询进行反走样,而不考虑所代入的纹理坐标。也就是说,基于在相邻像素上所计算的纹理坐标,硬件可以为每个查询决定要过滤的纹理面积。
    纹理映射的这个性质,可以用来替代滤波宽度函数filterwidth(),而无需调用ddx()和ddy()。我们以这样的一种方式执行纹理查询:通过它可以推测所过滤的纹理贴图面积,这里是推测需要过滤的程序化棋盘格纹理面积。这种解法分为两步:(1)为特定的纹理坐标选择mipmap级别;(2)利用上述技巧来决定过滤宽度。
    最终,这个trick可以在很多情况下很好的计算滤波宽度,运行性能几乎与基于求导的计算滤波宽度函数filterwidth()相同。

    【关键词提炼】

    快速滤波宽度估算(Fast Filter-Width Estimates)
    在着色器中求导(Derivatives in Shaders)
    用纹理计算过滤宽度(Computing Filter Width with Textures)


    二十六、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网站是 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.



    展开全文
  •  https://developer.nvidia.com/gpugems/GPUGems/gpugems_pref01.html   原书配套源代码、工程与资源下载:   http://http.download.nvidia.com/developer/GPU_Gems/CD_Image/Index.html   图 ...


     

                                        本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处 

                                        文章链接: https://zhuanlan.zhihu.com/p/35974789

     

     

     

    题图背景来自《战神4》。

     

    系列文章前言

     

    我们知道,《GPU Gems》1~3 、《GPU Pro》1~7 以及《GPU Zen》组成的饕餮盛宴,共11本书,合称“GPU精粹三部曲“,是游戏开发、计算机图形学和渲染领域的业界顶尖大牛们一线经验的合辑汇编,是江湖各大门派武林绝学经典招式的精华荟萃,是了解业界各种高阶知识和技法Trick,将自己的游戏开发、图形学与渲染能力提升到下一个高度的捷径。

     

    本文将总结提炼“GPU精粹三部曲“11本书中的第一本《GPU Gems 1》全书的核心内容,是【GPU精粹与Shader编程】系列文章正篇的第一篇,全文共1万5千余字。

     

    本文内容关键词:

    • 真实感水体渲染(Realistic Water Rendering)
    • 真实感皮肤渲染(Realistic Skin Rendering)
    • 无尽草地的渲染(Rendering Countless Blades of Waving Grass)
    • 水焦散渲染(Rendering Water Caustics)
    • 面部表情模拟(Facial expression simulation)
    • Perlin噪声(Perlin Noise)
    • 火焰的渲染(Fire Rendering)
    • 衍射的模拟(Simulating Diffraction)
    • 阴影的渲染(Shadow Rendering)
    • 电影级光照(Cinematic Lighting)
    • 阴影贴图抗锯齿(Shadow Map Antialiasing)
    • 全方位阴影贴图(Omnidirectional Shadow Mapping)

     

    为什么要分成上下两篇?

     

    原本计划,是将整本书的提炼总结一次性更新,总字数3万字。但很遗憾,当我将整本书的提炼内容3万字贴到文本编辑器中,内容排版都已经基本完成时,发现文本编辑器下方直接提示已超出1万6千字....

    这时我才发现,原来知乎专栏的单篇文章,其实也是有字数限制的,大概1万多汉字的样子。

    所以,原本全文3万字的整本书的提炼总结文章,将分为上下两部分发布。

    今天暂且发布上半部分,而下半部分的内容,则可以经过进一步的优化提炼,在下次更新中发布。

    不过话说回来,上半部分也已经超过1万5字,内容方面,应该完全够看了。

     

     

    GitHub上已更新完整的上下两篇

     

    GitHub上自然是不会像知乎专栏这样有单篇文章1万多字字数限制的,所以全部的3万字已经更新,想提前看3万字完整版的同学请戳GitHub链接:

    QianMo/Game-Programmer-Study-Notes

     

     

    系列文章风格说明

     

    为了让每篇文章的干货更足,内容更加详实,本文与后续文章的的写作风格与文章结构,将在系列文章开篇中的规划的写作风格的基础上,做一些微调。

    具体是将每篇需要提炼的章节内容分为两大部分:

    • 主核心内容
    • 次核心内容

    其中,主核心内容,将选取大家最感兴趣、最有提炼价值的渲染相关的内容,会用更加详细的篇幅进行提炼总结。每章主核心内容将包含五个部分:

    • 【章节概览】
    • 【核心内容提炼】
    • 【核心要点总结】
    • 【本章配套代码汇总表】
    • 【关键词提炼】

    而次核心内容,则会用更加精炼的篇幅进行总结。每部分将包含:

    • 【章节概览】
    • 【核心要点】
    • 【本章配套代码汇总表】
    • 【关键词提炼】

     

     

    目录 · 核心内容导航Highlight

     

    【说明】上文已经说明,因为知乎专栏的字数限制,导致原本3万字的内容需要分成两次发布,下文目录中加粗标题为本文将包括的内容,非加粗的标题将在下次的文章中发布。

     

    对《GPU Gems 1》全书核心内容,将进行重点提炼总结的主核心内容有:

    • 一、用物理模型进行高效的水模拟(Effective Water Simulation from Physical
      Models)
    • 二、Dawn Demo中的皮肤渲染(Skin in the Dawn Demo)
    • 三、无尽波动的草地叶片的渲染(Rendering Countless Blades of Waving Grass)
    • 四、次表面散射的实时近似(Real-Time Approximations to Subsurface
      Scattering)
    • 五、环境光遮蔽(Ambient Occlusion)

     

    对《GPU Gems 1》全书核心内容,将进行提炼总结的次核心内容有:

    • 六、水焦散的渲染 (Rendering Water Caustics)
    • 七、 Dawn Demo中的动画(Animation in the "Dawn" Demo)
    • 八、 改良的Perlin噪声实现(Implementing Improved Perlin Noise)
    • 九、Vulcan Demo中的火焰渲染(Fire in the "Vulcan" Demo)
    • 十、衍射的模拟(Simulating Diffraction)
    • 十一、高效的阴影体渲染(Efficient Shadow Volume Rendering)
    • 十二、电影级光照(Cinematic Lighting)
    • 十三、阴影贴图抗锯齿(Shadow Map Antialiasing)
    • 十四、全方位阴影映射(Omnidirectional Shadow Mapping)
    • 十五、使用遮挡区间映射产生模糊的阴影(Generating Soft Shadows Using Occlusion
      Interval Maps)
    • 十六、透视阴影贴图(Perspective Shadow Maps: Care and Feeding)
    • 十七、逐像素光照的可见性管理(Managing Visibility for Per-Pixel Lighting)
    • 十八、空间BRDF(Spatial BRDFs)
    • 十九、基于图像的光照(Image-Based Lighting)
    • 二十、纹理爆炸(Texture Bombing)
    • 二十一、实时辉光(Real-Time Glow)
    • 二十二、颜色控制(Color Controls)
    • 二十三、景深 (Depth of Field)
    • 二十四、高品质的图像滤波(High-Quality Filtering)
    • 二十五、用纹理贴图进行快速滤波宽度的计算(Fast Filter-Width Estimates with
      Texture Maps)
    • 二十六、OpenEXR图像文件格式(The OpenEXR Image File Format)

     

     

    《GPU Gems 1》其书

     

    《GPU Gems 1》英文原版出版于2004年4月,中文版《GPU精粹1》出版于2006年1月。需要说明的是,书中很多内容放到今天,并不过时,仍然很有研究、学习、运用、实践的价值。尤其是水体渲染,皮肤渲染,次表面散射、阴影渲染、后处理相关的章节。

    图 《GPU Gems 1》封面

     

    图 全书内容概览图

     

    《GPU Gems 1》随书配套资源与源代码下载

     

    这一节提供了《GPU Gems 1》随书的配套资源,以及源代码的下载地址。

    PS:配套的不少工程中不仅包含完整的源码,也直接包含经过编译后的exe执行文件,可以直接运行后查看效果。

    NVIDIA官方网站上<GPU Gems>1~3 Web版的url变更有几次了,下面的链接,是目前最稳定版本。

    • 原书全文的Web版本:

                  https://developer.nvidia.com/gpugems/GPUGems/gpugems_pref01.html

                

    • 原书配套源代码、工程与资源下载:

                  http://http.download.nvidia.com/developer/GPU_Gems/CD_Image/Index.html

     

    图 配套资源的截图

     

    • 另外,我维护了的一个名为“GPU-Gems-CD-Content”的GitHub仓库,以备份这些珍贵的资源,也方便直接在GitHub Web端查看大牛们写的代码:

                【Github】QianMo/GPU-Gems-CD-Content

     

     

     

     

    第一部分 · 主核心内容提炼总结

     

     

    一、 用物理模型进行高效的水模拟(Effective Water Simulation from Physical Models)

     

    【内容概览】

     

    本章介绍了在GPU中模拟和渲染大型水体的一些方法,并且提出了改进反射的一些有用技巧。

    文章由计算简单的正弦函数之和来对水面进行近似模拟开始,逐步扩展到更复杂的函数如Gerstner波,也扩展到像素着色器。主要思路是使用周期波的加和,来创建动态的平铺(tiling)凹凸贴图,从而获得优质的水面细节。

    这章也集中解释了水体渲染与模拟系统中常用参数的物理意义,说明了用正弦波之和等方法来近似水面的要点。

    图 基于文中水体技术渲染的Uru:Ages Beyond Myst中的场景

     

    【核心内容提炼】

     

    1.1 背景与范围

    《GPU Gems 1》出版于2004年,在这几年间,实时渲染技术渐渐从离线渲染领域中分离,自成一派。

    而《GPU Gems 1》中收录的这篇文章问世期间,快速傅里叶变换(Fast Fourier

    Transform,FFT)库已经能用于顶点和像素着色器中。同时,运行于GPU上的水体模拟的模型也得到了改进。Isidoro等人在2002年提出了在一个顶点着色器中加和4个正弦波以计算水面的高度和方位的思路。另外,Laeuchi在2002年也发表了一个使用3个Gerstner波计算水面高度的着色器。

    图 基于快速傅里叶变换的水体渲染

     

     

     

    1.2 水体渲染的思路

    文中对水体渲染的思路,运行了两个表面模拟:一个用于表面网格的几何波动,另一个是网格上法线图的扰动。这两个模拟本质上是相同的。而水面高度由简单的周期波叠加表示。

    正弦函数叠加后得到了一个连续的函数,这个函数描述了水面上所有点的高度和方向。在处理顶点时,基于每个顶点的水平位置对函数取样,使得网格细分形成连续水面。在几何分辨率之下,将该技术继续应用于纹理空间。通过对近似正弦叠加的法线取样,用简单像素着色器渲染到渲染目标纹理(render target texture),从而产生表面的法线图。对每帧渲染法线图,允许有限数量的正弦波组相互独立地运动,这大大提高了渲染的逼真度。

    而直接叠加正弦波产生的波浪有太多的“簸荡(roll)”,而真实的波峰比较尖,波谷比较宽。事实证明,正弦函数有一个简单的变体,可以很好地控制这个效果。

     

    1.2.1 波的选择

    对于每个波的组成,有如下几个参数需要选择:

    • 波长Wavelength (L):世界空间中波峰到波峰之间的距离。波长L与角频率ω的关系为

      ω=2π/L。

    • 振幅Amplitude (A):从水平面到波峰的高度。
    • 速度Speed (S):每秒种波峰移动的距离。为了方便,把速度表示成相位常数 φ=S x

      2π/L。

    • 方向Direction (D):垂直于波峰沿波前进方向的水平矢量。

    波的状态定义为水平位置(x,y)和时间(t)的函数:

     


    图 单个波函数的参数

     

    而包括所有的波i的总表面是:

    为了提供场景动力学的变量,我们将在约束中随机产生这些波的参数,随着时间的变化,我们会不断将某个波淡出,然后再以一组不同的参数将其淡入。且此过程的这些参数是相关联的,必须仔细地产生一套完整的参数组,才能使各个波以可信的方式进行组合。

     

    1.2.2 法线与切线

    因为我们的表面有定义明确的函数,所以可以直接计算任意给定点处的曲面方向,而不是依赖于有限差分技术。

     

    副法线(Binormal)B和正切矢量T分别是x和y方向上的偏导数。

    对于2D水平面中的任意点(x,y),表面上的三维位置P为:

    求副法线(Binormal)B方向,即对上式对x方向求偏导。而求正切矢量T方向,即对上式对y方向求偏导。

    而法线N由副法线B和切线T的叉积给出:

     

    1.3 波的几何特征

    首先文中将几何波限制为4个,因为添加更多的波并不能增加新的概念,只不过增加更多相同的顶点Shader处理指令和常数而已。

     

    1.3.1 方向波或圆形波的选择

    需要对下图所示的方向波或圆形波进行选择。

    图 方向波和圆形波

     

    对于两种类型的波,视觉特性和复杂性都是由干涉条纹引起的。

    方向波需要的顶点shader处理指令较少,但是究竟选择何种波需要取决于模拟的场景。对于大的水体,方向波往往更好,因为它们是风吹动产生的波较好的模型。对于较小的池塘的水,产生波的原因不是由于风,而是诸如例如瀑布,水中的鱼,圆形波则更好一些。对于方向波,波的方向是在风向的一定范围内任意绘制的;对于圆形波,波中心是在某些限定的范围内任意绘制的。

     

    1.3.2 Gerstner波

    正弦波看起来圆滑,用于渲染平静的,田园诗般的池塘很合适。而对于粗犷的海洋,需要形成较尖的浪头和较宽的浪槽,则可以选择Gerstner波。

    Gerstner波早在计算机图形学出现之前就已经被研发了出来,用于物理学基础上为海水建模。Gerstner波可以提供一些表面的微妙运动,虽然不是很明显但是却很可信(具体可见[Tessendorf 2001])。

    另外,Gerstner波有一种经常被忽略的性质:它将顶点朝着每个浪头顶部移动,从而形成更尖锐的波峰。因为波峰是我们水表面上最锐利的(即最高频率,最主要)特征,所以我们正希望顶点可以集中在此处。

    图 Gerstner波

    图 基于Gerstner渲染出的水面 @Unreal Engine 4

     

    1.3.3 波长等参数的选择

     

    波长等参数的选择方法:

    • 波长的选择,要点是不要追求波在真实世界中的分布,而是要使用现在的少数几个波达到最大效果。对波长相似的波进行叠加可以突显水面的活力。于是文中选择中等的波长,然后从它的1/2至两倍之间产生任意波长。
    • 波的速度,通过波长,基于公式即可计算得出。
    • 振幅方面,主要是在Shader中指定一个系数,由美术同学对波长指定对应的合适振幅。
    • 波的方向,运动方向与其他参数完全独立,因此可以自由选择。

     

    1.4 波的纹理特征

    加和到纹理中的波也像上文说到的顶点一样需要参数化,但是其具有不同的约束条件。首先,在纹理中得到宽频谱更为重要。其次,在纹理中更容易形成不像天然波纹的图案。第三,对给定波长只有某些波方向能保证全部纹理的平铺(tiling)。也就是说,不像在世界空间中仅仅需要注意距离,在纹素(texel)中要注意所有的量。

    文中的思路是在2到4个通道中,使用15个频率和方位不同的波进行处理。虽然4个通道听起来有点多,但是它们是进行256 x 256分辨率的渲染目标纹理的处理,而不是处理主帧的帧缓冲。实际上,生成法线贴图的填充率所造成的影响小到可以忽略不计。

     

    1.5 关于深度

    首先,把在顶点上的水深度作为一个输入参数,这样,在着色器碰到岸边这样的微妙区域时,便可以自动进行校正。

    因为水的高度需要计算,所以顶点位置的z分量就没什么用了。虽然我们可以利用这点来压缩顶点的数据量,但是选择把水深度编码在z分量中,是一个更好的选择。

     

    更确切地说,就是把水体底部的高度放在顶点的z分量中,作为常数带入水的高度表中,这样通过相减,即可得到水深度。而同样,这里假定了一个恒定高度的水位表(constant-height water table)。

    我们也使用水深度来控制水的不透明度、反射强度和几何波振幅。简单来说,即水浅的地方颜色浅,水深的地方颜色深。有了适当的水深度,也就可以去光的传播效果进行更完善的建模。

    图 真实感水体渲染效果图 @Unreal Engine 4

    【核心要点总结】

     

    文中提出的水体渲染方法,总结起来有三个要点:

    1)使用周期波(正弦波、Gerstner波)的加和

    2)创建动态的平铺(tiling)贴图

    3)使用凹凸环境映射(Bump-Environment Mapping)

     

    【本章配套代码汇总表】

     

    文中并没有贴出相关代码,但原书配套CD提供了完整的源代码和项目工程,具体代码和工程可以查看:

    【Github】QianMo/GPU-Gems-CD-Content

     

    【关键词提炼】

     

    水的模拟(Water Simulation)

    水的渲染(Water Rendering)

    正弦函数近似加和(Sum of Sines Approximation)

    Gerstner波(Gerstner Waves)

    凹凸环境映射(Bump Environment Mapping)

     

     

     

    二、Dawn Demo中的皮肤渲染(Skin in the Dawn Demo)

     

     

    十年技术变迁: NVIDIA Dawn Demo

     

    最初的Dawn Demo由NVIDIA于2002年发布,而十年之后的2012年,NVIDIA新发布了“A New Dawn”技术Demo。

    图 A New Dawn Demo截图

    以下是一张新老Demo的对比效果图。

    图 Dawn Demo (2002年)

     

    图 A New Dawn Demo (2012年)

    图 技术指标的对比

     

    【章节概览】

     

    这章详细介绍了NVIDIA出品的Dawn Demo中对精灵人物的着色技术,主要是皮肤的着色技巧。在当时(2002年)NVIDIA创造的此demo的品质,已经成为照片级真实感渲染和实时渲染的代表。

    图 Dawn Demo截图

    【核心内容提炼】

     

    2.1 关于皮肤着色

    基于多种原因,在计算机图形中模拟皮肤十分困难。在当时,即使是在电影中用高端产品模拟出来的仿真角色,通常也经不起近距离的观察。因为,人类可以从中获得大量非语言来表达的信息,如重心的移动,走动的特别习惯,面部的表情,甚至有些人的皮肤泛红等等。

     

    虽然很少有人能理解像“次表面散射(Subsurface Scattering)”、“轮廓照明(Rim

    Lighting)”这些词汇,但是当把它们渲染错了的时候,几乎任何人都可以指出来。而且除了着色问题外,有时人们会因为皮肤渲染的问题,说皮肤看起来像是塑料做的。

     

     

    2.2 皮肤如何对光进行响应

    皮肤不像大多数在计算机渲染中建模的表面,因为它是由半透明的表皮、真皮和皮下组织等数层构成的。这可以用次表面散射来模拟。这种现象很普遍,当在太阳面前向上举起手,就能看到穿过皮肤的桔红色的光。

    图 次表面散射-穿过皮肤的桔红色的光

    皮肤下的散射在所有的角度上显现皮肤形态,使它具有了柔软的、与众不同的特征。

    在这之前有一些小组尝试使用多层纹理贴图来模仿皮肤的复杂性,但一般而言,这个方法比较难管理,美术同学很难通过预想,混合出最终符合预期的效果。

    相反,文中使用单张彩色贴图,通过着色程序来增加色彩的变化。

    图 Dawn头部的前半边的漫反射贴图

     

    另外,皮肤具有一些极细微的变化,会影响其反射特性。这对皮肤外观有微妙的影响,特别是当光线直接与相机位置相反时,皮肤的表现则是存在边缘(Edge)与轮廓光照(Rim Lighting),这时,需要皮肤轮廓边缘的光照,或给皮肤边缘加上光晕。

    真正的皮肤具有一些细微的特征,比如汗毛和毛孔能捕捉光线。尽管这些细节用于显式地建模是太不明显了,但我们还是希望得到一个合适、整体更逼真的皮肤渲染外观。在特写时,可以增加凹凸贴图,提供一些额外的细节,特别是一些小的皱纹。但需要注意,我们想要的是柔软的皮肤外观,而不是光闪闪的油腻的塑料。另外,凹凸贴图通常只需静距离特写时才可见。

    我们可以通过建模来近似这两个着色属性,建模可以是基于表面法线的简单公式,或者是基于光线或视线矢量的简单公式。

    通过认识,我们可以将上述两种渲染特性(次表面散射和边缘光照),建模为基于表面法线和照明或观察向量的简单公式,从而近似出两种着色属性。尤其是沿着Dawn的轮廓边缘,对她身后的光线取样,按照观察向量的索引,让“穿过”Dawn的光与她的基础皮肤色调混合,从而创建次表面散射和边缘光照的着色效果。尤其是背景图中更加明亮的区域。如下图。

    图 Dawn的头部前面的切线空间法线贴图(凹凸贴图)

    2.3 场景的照明

    Dawn Demo中场景的照明使用了基于图像的光照(Image Based Lighting ,

    IBL),创建高动态范围(High-Dynamic Range,HDR))的全景,使用环境映射贴图(Environment Maps)进行场景的照明。

     

    图 立方体环境反射贴图

     

    漫反射环境贴图(Diffuse Environment Map)也是一个立方体映射贴图,它使用网格表面的法线作为索引。每个像素存储了相应法线与入射光夹角的余弦加权平均值。

    图 漫反射环境贴图(Diffuse Environment Map)

     

    镜面高光环境贴图(Specular Environment Map)同样也是一个立方体映射贴图,使用反射矢量作为索引(类似于立方体映射)。把此镜面高光环境贴图基于粗糙因子进行模糊,目的是模拟对任何表面任何给定点上的法线的改变。

    图 镜面高光环境贴图(Specular Environment Map)

     

    存在的问题是,漫反射环境贴图(Diffuse Environment Map)和镜面高光环境贴图(Specular Environment Map)考虑了来自环境的入射光,但不包含由物体引起的阴影。

    要解决这个问题,可以生成一个遮挡项,用来近似表达在每个顶点上半球辐射光中,有多大比率场景中其他物体所遮挡。

     

    2.4 实现

    Dawn Demo中,毫无悬念地使用顶点着色器和像素着色器进行光照处理,顶点shader的主要功能是将坐标转换到投影空间,并执行那些不能在像素着色器中执行的数学运算。

    采用单通道(one-pass)的光照解决方案,不需要另外其他的通道渲染,或alpha混合来创建皮肤表面。

    文中提供了完整的顶点Shader和像素Shader的源代码,这里因为篇幅原因不再赘述,具体可以参考原文(PS:上文有贴出Web版的英文全书原文的链接)。

     

    【核心要点总结】

     

    文中采用的皮肤渲染方法,总结起来有三个要点:

    1)基于图像的光照(Image Based Lighting , IBL),采用高动态范围(High-Dynamic-Range , HDR)光照环境映射贴图

    2)次表面散射(Subsurface Scattering)

    3)对皮肤边缘加上光晕,即轮廓照明/边缘光照(Rim Lighting)

     

     

    【本章配套代码汇总表】

     

    Example 3-1. 从CPU应用程序接收的每个顶点数据示例代码(The Per-Vertex Data

    Received from the CPU Application)

    Example 3-2. 输出顶点的数据结构示例代码(The Data Structure of the Output

    Vertices)

    Example 3-3. Dawn脸部的皮肤渲染顶点着色器示例代码(A Sample Vertex Shader for

    Dawn's Face)

    Example 3-4. Dawn脸部的皮肤渲染片元着色器代码(The Fragment Shader for Dawn's

    Face)

     

    【关键词提炼】

     

    皮肤渲染(Skin Rendering)

    次表面散射(Subsurface Scattering)

    轮廓照明(Rim Lighting)

    基于图像的光照(Image Based Lighting ,IBL)

    高动态范围(High-Dynamic-Range, HDR)

    环境映射贴图(Environment Maps)

     

     

    三、无尽波动的草地叶片的渲染(Rendering Countless Blades of Waving Grass)

     

    【章节概览】

     

    这章关于巨量自然元素的渲染,特别是对于无尽波动的草地叶片的渲染。作者对Codecreatures demo中首次成形的技术进行了扩展,使其能够高性能的渲染,以更好地适应游戏引擎的需要。

    图 Realistic Grass Field @Giovanni Baer

     

    【核心内容提炼】

     

    3.1 概述

    首先,需要意识到,对单个草叶的细节建模意义不大,因为那样大片草地需要的多边形数目会太多。

    所以,我们必须建立一个符合以下条件的简单而有用的替代方案:

    • 许多草的叶片必须由少数多边形表示。
    • 草地必须从不同的视线看起来显得密集。

    而要做到让场景不依赖于摄像机的位置和方向,可以把一些草叶组合起来,表示在一个纹理中,并将多个纹理组合起来,且在结果中单个的多边形不应该引起注意。当观察者四处活动时,通过将草体加入混合操作或者移除混合操作,以在距离范围内增加或删去草体,来保证整个草地的渲染效果具有稳定的视觉质量。

     

    3.2 草的纹理

    草的纹理,应该是一些一簇一簇聚集丛生的草,否则,会出现大片的透明区域。

    需在透明的alpha通道上画实体草茎。在彩色通道中,用深浅不同的绿色和黄色,来较好地区别各个单独的叶片,也应该模拟不同情况的草叶:长得好的和长得差的、老的和嫩的,甚至区别叶片的前面与后面。

    下图是一个草地纹理的示例。

    图 草地纹理的示意图

    3.3 草体

    这一部分将探讨总结如何对多边形进行组合,并用上文提到的草地纹理进行映射,以模拟出茂密的草地,并且不凸显个别多边形。此技术也保证了单个多边形不可见。

    因为用户能自由地在场景中游玩,下图所示的结构便不能产生令人信服的效果。

    图 线性排布

     

    对于线性排布,如果从垂直于多边形的方向观看场景,就会立刻穿帮,看出草地多边形的结构是线性排布的。另外这种情况下草地会看起来非常稀疏。只有在摄像机自动导航,或者渲染无法到达的远距离草地时,才会考虑这样的排布。

    为了保证独立于当前视线的良好视觉质量,我们必须交叉地排布草地多边形。已证明,使用星型结构是非常好的。下图给出了“草体”可能的两种变体。

    他们由3个相交的方块构成。我们必须禁用背面剔除来渲染多边形,以保证双面都可见。为了得到合适的照明度,应该让所有顶点的法线方向与多边形的垂直边平行。这保证了位于斜坡上的所有草体都可以得到正确的光照,不会因为地形的亮度而出现差异。

    图 草体的交叉排布

     

     

    如果把这些草地物体彼此相当靠近地设置在一个大的区域里,如下图。在运行期间把它们从后向前进行排序,使用alpha混合,并启用Draw

    Call中的z-testing/writing,那么就会得到自然而茂密的草地渲染效果。

     

    图 草地的扩展

    3.4 草地的动画

    关于草地的动画,基本思想是以三角函数(尤其是正弦和余弦)为基础进行计算,且计算应该考虑到移动的位置和当前时间、风向和强度。

    以基本思想为基础,实现起来有几种方法:

    1)每草丛草体的动画(Animation per Cluster of Grass Objects)

    2)每顶点的动画(Animation per Vertex)

    3)每草体的动画(Animation per Grass Object)

     

    三种方法各有优缺点,而文中都给出了具体算法步骤和实现的Shader源码,这里因为篇幅原因,便不展开分析了,具体可以参阅原文。

    最终可以实现的渲染效果。

    图 Realistic Grass

    【核心要点总结】

    1)草的纹理,应选取一簇一簇聚集丛生的草。在透明的alpha通道上画实体草茎。在彩色通道中,用深浅不同的绿色和黄色,区别各个单独的叶片。

    2)草体的渲染,适合进行交叉排布,从后向前进行排序,使用alpha混合,并启用Draw

    Call中的z-testing/writing,便能得到自然而茂密的草地渲染效果。

    3)草地的动画,以三角函数(尤其是正弦和余弦)为基础,且应该考虑到移动的位置和当前时间、风向和强度。实现起来有三种方法:

    1. 每草丛草体的动画(Animation per Cluster of Grass Objects)
    2. 每顶点的动画(Animation per Vertex)
    3. 每草体的动画(Animation per Grass Object)

     

    【本章配套代码汇总表】

    Example 7-1. 顶点着色器框架(Framework in the Vertex Shader)

    Example 7-2. 对每草丛草体的动画的实现Shader代码(Code for Animation per Cluster

    of Grass Objects)

    Example 7-3. 每顶点动画实现Shader代码(Code for Animation per Vertex)

    Example 7-4. 每草体的动画实现Shader代码(Code for Animation per Grass Object)

     

    【关键词提炼】

    草地渲染(Grass Rendering)

    草地动画(Grass Animation)

    草体(Grass Objects)

     

     

     

     

    第二部分 · 次核心内容提炼总结

     

     

    六、水焦散的渲染 (Rendering Water Caustics)

     

    【章节概览】

    这一章介绍了一种从美学角度出发(aesthetics-driven)来实时渲染水中焦散的方法。

    图 水的焦散效果

    【核心要点】

    水的焦散(Water Caustics)的定义:光从弯曲的表面反射或者折射,只聚焦在受光面的某些区域,于是就是产生焦散的现象。

    图 折射的计算(入射光线(E)从介质η1进入介质η2,发生折射,产生折射光线(T))

     

    首先,从模拟的观点出发,焦散其实可以通过正向或逆向光线追踪计算。

    正向光线追踪中,要追踪从光线射出并穿过场景的光线,累计其在不断地区的贡献。

    而逆向光线追踪,则以相反的过程工作,从海底开始,按照与入射相反的顺序逆向根据光线,计算给定点的所有入射光线总和。

    而该文章中,前一节介绍了逆向蒙特卡洛光线追踪的一个简化,并大胆假设一些光线对焦散有贡献,并只计算到达海底光线的一个子集,因此,该方法计算消耗非常少,却产生了尽管在物理上不正确但是非常逼真的焦散图样和效果。由于整个效果看起来非常令人信服,尤其是图像质量,使得这个方法非常值得实现。文中用HLSL和OpenGL都进行了实现,并按照惯例,提供了源码。

     

    该算法的伪代码如下:

    1.Paint the ocean floor.
    2.For each vertex in the fine mesh:
        a.Send a vertical ray.
        b.Collide the ray with the ocean's mesh.
        c.Compute the refracted ray using Snell's Law in reverse.
        d.Use the refracted ray to compute texture coordinates for the "Sun" map.
        e.Apply texture coordinates to vertices in the finer mesh.
    3.Render the ocean surface.

     

    【本章配套代码汇总表】

    Example 2-1. 关于波函数、波函数的梯度以及线平面截距方程的代码示例,(Code Sample for the Wave Function, the Gradient of the Wave Function, and the Line-Plane Intercept Equation)

     

    Example 2-2. 最终渲染通道代码示例,展示了依赖纹理读取操作 (Code Sample for the Final Render Pass, Showing the Dependent Texture Read Operations)

     

    【关键词提炼】

    水焦散渲染(Rendering Water Caustics)

    逆向蒙特卡洛光线追踪(backward Monte Carlo ray tracing)

    折射(Refraction)

     

     

    七、 Dawn Demo中的动画(Animation in the "Dawn" Demo)

     

    【章节概览】

    这章主要讲到编程人员如何帮助美术同学对混合形状实行控制,从而创建不同的表情。主要是使用顶点Shader通过索引的蒙皮和变形网格对象(morph

    target)来使一个高分辨率网格变形,实现角色表情和动画等效果。也讨论了为实现实时动画而考虑的各种折中方案。

    图 Dawn Demo的实时屏幕截图

     

     

    【核心要点】

    使用变形目标(Morph Target)是表现复杂网格变形的常用方法。NVIDIA Demo团队使用此技术创建的Zoltar等Demo从每秒插值30个网格开始,然后基于累计误差方案(Accumulated Error Scheme)去除关键帧。使得我们能够缩小文件并减少存储空间,最多可以将三分之二的原始关键帧,同时几乎不会出现可见的失真。在这种类型的网格插值中,任何给定时间中只有两个插值关键帧处于激活状态,而且他们是连续地执行的。另外,变形目标可以并行使用。

     

    原文也中对变形目标(Morph Target)的具体实现进行了论述。

    图 表情的混合对象(混合形状)

     

    而蒙皮(Skinning)是一种网格变形方法,对网格中的每个顶点指定一组带有权重的矩阵(权重最大可增加到1.0)。权重指明矩阵应该如何约束顶点。

    为一个网格蒙皮做准备,通常要为网格创建一个中间状态,叫做绑定姿势(Bind Pose),这个姿势保持胳膊和腿略微分开,并且尽可能避免弯曲。

    图 Dawn的绑定姿势(Bind Pose)

     

    【本章配套代码汇总表】

    Example 4-1 以线性或连续样式运用到变形目标的示例代码(Applying morph targets in

    a linear or serial fashion sample code)

    Example 4-2 单个"multiply-add"用于每个变形目标的示例代码(Single "multiply-add"

    instruction for each morph target sample code)

    Example 4-3 变形目标的实现示例代码(Morph Target Implementation sample code)

    Example 4-4 使用四根骨头蒙皮的示例代码(Application of four-bone skinning sample

    code)

     

    【关键词提炼】

    面部表情模拟(Facial Expression Simulation)

    网格动画(Mesh Animation)

    变形目标(Morph Target)

    蒙皮(Skinning)

     

     

    八、 改良的Perlin噪声实现(Implementing Improved Perlin Noise)

     

    【章节概览】

    这章的作者是奥斯卡得主Ken Perlin。他提出的噪声算法(Perlin Noise)已在实时和离线计算机图形学中得到多方面运用。这篇文章详细阐述了最新进展,纠正了最初的两个缺陷,也提供了有效及稳定的框架结构,用于在现代可编程硬件上执行噪声运算。

     

    【核心要点】

    首先,噪声函数的目的,是在三维空间中提供一种可以有效率地实现、可重复,伪随机的信号。其信号的能带有限(band-limited),大部分能量集中在一个空间频率附近,而视觉上是各向同性(isotropic)的,统计上不随旋转变化。

    一般的想法是创建某种信号,类似于一个完全的随机信号(即白噪声),通过低通滤波后,滤除了所有的空间高频率而变得模糊。有如沙丘你缓慢上升的山包和下落的低谷。

    图 沙丘与噪声

     

     

    最初的噪声在1983年实现,1985 (Perlin 1985)发表,思想是使用埃尔米特-样条(Hermite

    spline)插值法等方法实现,原文中对此方法的步骤进行了描述。

    图 使用埃尔米特-样条(Hermite spline)插值法,从常规3D格点的八个样本中插值

     

    图 通过噪声函数产生的一个切片样条

     

    这篇文章从两个方面对最初的噪声方法的不足进行了改进:

    插值的特性以及伪随机斜率场(field of pseudo-random gradients)的特性。

    图 四种基于噪声生成的纹理

     

    而另外一个关于噪声的思路是,用体积噪声制造程序式纹理(Procedural texturing using volumetric noise),这样可以不创建显式的纹理图像,来得到自然的材质。这种方法在当年的大片《指环王》中,已经有了广泛应用。

     

    【本章配套代码汇总表】

    5-1 假设模型是单位半径球体,实现凹凸模式的示例代码(Assuming the model is a unit-radius sphere, the expressions that implement these bump patterns sample Code)

     

    【关键词提炼】

    Perlin噪声(Perlin Noise)

    噪声函数(Noise function)

    伪随机斜率场(Field of Pseudo-Random Gradients)

    体积噪声( volumetric noise)

    埃尔米特样条(Hermite spline)

     

    九、Vulcan Demo中的火焰渲染(Fire in the "Vulcan" Demo)

     

    【章节概览】

    这章讲述了GeForce FX 5900上市时的Demo“Vulcan”中的火焰渲染技术。其中的技术并非真正的物理模拟,而是对当时的工业标准电影《指环王》的离线技术的跟进。通过文中改进,突破了光栅化大量粒子时操作性能的限制,产生了真实可信的火焰图像。

    图 基于本章方法实现的"Vulcan" Demo的截图

     

    【核心要点】

    首先文章尝试了两个方案:

    完全程序化的火焰( fully procedural flames)和屏幕空间基于变形的二维火焰(screen-space 2D distortion-based flames.),经过试验都未达预期。

    于是改采用视频纹理精灵(video-textured sprites ),最终达到预期,并实现出了逼真的火焰,且占用很少的GPU资源。

    图 用于创建火焰效果的连续镜头

     

    其中,烟的生成使用粒子系统创建一个烟雾生成器。而所需的光照可以采用不同的技术达到,如光线投射。

    图 程序式地产生烟

     

    而火焰和烟的混合,比较常规地使用相加混合(additive blending)。

    关于使火焰增加多样性,文中使用了水平和垂直翻转(沿着u和v轴)。而使用任意旋转可以更加具表现力。

    图 由自定义纹理坐标生成的变体

    【本章配套代码汇总表】

    Example 6-1 最终的实现Shader代码(The Final Shader)

     

    【关键词提炼】

    火焰渲染(Fire Rndering)

    完全程序化的火焰(fully procedural flames)

    屏幕空间基于变形的二维火焰(screen-space 2D distortion-based flames)

    视频纹理精灵(video-textured sprites )

     

     

     

     

     

    十、衍射的模拟(Simulating Diffraction)

     

    【章节概览】

    这章讲述了简化的Jos衍射光照模型(最初在SIGGRAPH 1999上发表),此模型以光的物理性质为基础,将光当做波来进行建模,从而创建出多彩的干涉条纹。

     

    【核心要点】

    什么是衍射(Diffraction)?

    小尺度的表面细节引起反射波彼此干扰,这个现象就是衍射。

    首先,计算机绘图的大多数表面反射模型都忽略自然光的波动效果。当表面的细节比光的波长(约1um)大许多时,不存在问题。但对于小尺寸的细节,例如一个光盘的表面,波效应就不能忽略了。所以,对于小尺度的表面细节引起反射波彼此干扰的现象,即为衍射。

    衍射使这些表面的反射光呈现五彩缤纷的图案,由光盘的精细反射可以看到这一现象。

    图 光盘的衍射

    衍射的实现,可以在Shader的顶点着色器上,也可以在片元着色器上,且实现可以在任何网格上进行,只需提供一个“切线向量”,和每顶点的法线及位置。而切线向量提供表面上窄条带的局部方向。对于一个光盘,其为轨道的方向,如下图。

    图 光盘的切线向量

     

    对应给定衍射波长的颜色,可以使用简单近似的彩虹贴图。贴图从紫到红排列,而且提供彩虹的大部分颜色,用三个理想凹凸函数(峰值分别在蓝、绿和红的区域)简单混合而成。

     

    图 用于shader的彩虹彩色贴图

     

    而最终的衍射颜色是彩色的衍射图案和各项异性高光的简单相加的和。

    图 光盘衍射实时的3个快照


    图 用纹理映射各项异性主要方向表面的3个快照

    【本章配套代码汇总表】

    Example 8-1. 衍射的顶点着色器代码(The Diffraction Shader Vertex Program)

     

    【关键词提炼】

    衍射模拟(Simulating Diffraction)

    各项异性(Anisotropy)

     

     

     

    十一、高效的阴影体渲染(Efficient Shadow Volume Rendering)

     

    【章节概览】

     

    这章全面讲述了用于实时阴影渲染中常见两种流派之一的阴影体(Shadow Volumes)技术,又称模板阴影(Stencil Shadows)技术,重点是得到正确的角度的情形,减少几何图形和填充率的消耗。

     

    【核心要点】

    当时id software的《Doom 3》就是采用阴影体(Shadow Volumes)技术来对阴影进行的渲染。具体思想是在模板(stencil)缓冲标记阴影的像素,把像素分为阴影或照明两种类型,接着调节负责光照的像素程序,使阴影像素的照明贡献度为0。

    阴影体技术可以为点光源、聚光灯和方向光源创建清晰的、逐像素进度的阴影。单个物体可以被多个光源照亮,而且光有任意颜色和衰减度。阴影从三角形网格投射到深度缓冲区上。这意味着被遮挡的物体,可以是带有深度缓冲区的网格、公告板、粒子系统或预先渲染的场景。

    较其他运算相比,阴影体可以更好地处理许多制作困难的阴影场景,如一个插在万圣节南瓜灯内部的光源。

    图 阴影体技术可以很好胜任的渲染场景

     

    阴影体的缺点是对那些没能正确表达自身形状的网格的阴影表达效果并不理想。如一些带透明区域的公告板,粒子系统,或带alpha粗糙度的纹理网格(如一片树叶)。这些投影体基于他们的真实网格产生阴影,阴影与物体的真实形状并不匹配。而阴影体的另一个缺点是对带裂缝的网格支持不太好。文中也表示,当时阴影体运行的理想场景是顶部俯视。

    图 模型上的裂缝会让影子穿过空气漏出来

     

    总之,这篇文章对McGuire等人2003年提出的方法进行了很好的描述、分析与实践。而在这篇文章发出之后的若干年,阴影体技术得到了各种进一步地优化与改进。

     

    【本章配套代码汇总表】

    Example 9-1 程序结构伪代码(Program Structure Pseudocode)

    Example 9-2 glFrustum风格的无限投影矩阵(An Infinite Projection Matrix in the Style of glFrustum)

    Example 9-3 用于从示例光源中“挤”出 w=0顶点的顶点着色器代码(A Vertex Shader for Extruding w = 0 Vertices Away from the Example Light)

    Example 9-4 (The markShadows Method)

    Example 9-5 findBackfaces方法(The findBackfaces Method)

    Example 9-6 renderShadowCaps方法(The renderShadowCaps Method)

    Example 9-7 renderShadowSides方法(The renderShadowSides Method)

     

    【关键词提炼】

    阴影渲染(Shadow Rendering)

    阴影体(Shadow Volume)/ 模板阴影(Stencil Shadows)

    多通道渲染(Multipass Rendering)

     

     

    十二、电影级光照(Cinematic Lighting)

     

    【章节概览】

    本章中介绍了一个的简化的uberlight(可理解为“全能光照”)实现,此光照shader根据Ronen Barzel(1997,1999)提出的照明模型编写而成。而该模型的超集已由Pixar动画开发,并应用于《玩具总动员》、《怪物公司》、《海底总动员》等一系列的迪士尼电影中。

    本章所对该光照模型的尝试,旨在提供一套全面的光照控制参数,以涵盖灯光美术师日常使用的大部分效果。

    图 《怪物公司》 中cookies对窗户效果的贡献

     

    【核心要点】

    首先,该章中呈现的Shader只模拟光照场景光源的形成和控制,不包括如何模拟表面细节和光反射行为的复杂性。

    大体上,用于电影产品的照明模型会进行两种操作,类似于显示在这里的伪代码:

    color illuminationModel()
    {
       Computer the surface characteristic
       For each light   {
            Compute the surface response(计算表面响应)
            Evaluate the light source (评估光源)   }
    }


     

    首先,通过这些方式计算表面着色信息:运行各种纹理查找(texture lookups),在网格上插值(interpolating values over the mesh),计算程序模式(computing procedural

    patterns)等。然后在照明物体的每个光源上循环,计算出它的贡献。我们通过对每个光线计算光的颜色,然后计算表面对照明的响应来进行上述操作。

    原文中给出了一个Shader源代码,该Shader用于计算塑料(plastic)材质在只有一个光源贡献的反射模型。,可以很容易将它扩展为更通用的多光源和更多表面的解决方案。

    该Shader为美术师提供了各个方面的照明控制:选择(指定物体是否响应接受光照),颜色,形状,阴影和纹理,而阴影选项中包括明暗度、色调、反射、阴影贴图、阴影模糊等参数。

     

    下面两幅图说明了uberlight 的使用效果。照明来自Pixar短片“Geri's Game”中的人物头部。

    图 (a)Geri由一个光源照明;(b)改变光的权重,修改反射高光对比度;(c)改变阴影颜色,加强阴影;(d)改变谷仓形状(类似窗户一样的遮挡物),创建更戏剧化的姿态;(e)使用一块模糊的纹理cookie,丰富图像;(f)夸大透射的cookie的对比,创建像外星人一样的效果

     

    图(a)常态 (b)黑色电影(noir)的高反差 (c)柔和的光线

    【本章配套代码汇总表】

    10-1. The Vertex Program for an Uberlight-Like Shader

    10-2. The Fragment Program for an Uberlight-Like Shader

     

    【关键词提炼】

    电影级光照(Cinematic Lighting)

    全能型光照(Uberlight)

    照明模型(Lighting Model)

    储存于本地的光照数据(Light Cookies)

     

     

     

    十三、阴影贴图抗锯齿(Shadow Map Antialiasing)

     

    【章节概览】

    这章介绍了如何通过邻近百分比过滤方法(Percentage-Closer Filtering , PCF)有效减少阴影贴图的反走样。

     

    【核心要点】

    阴影贴图(Shadow Map,又译作阴影映射)是渲染阴影的常见方法,也是渲染阴影领域的两大流派之一,但是它存在走样的问题。通常使用高分率的阴影贴图和增加阴影贴图的分辨率来反走样,也就是使用Stamminger和Drettakis 2002年提出的“透视阴影贴图( perspective shadow maps)”技术。但是,当光与表面接近于平行的时候,使用“透视阴影贴图”技术和增加阴影贴图分辨率就不起作用了,因为放大的倍数接近于无穷大。

    高端渲染软件使用“临近的百分比过滤(Percentage-Closer Filtering , PCF)”技术解决走样问题。最初的PCF算法由Reeves等人1987年提出。其计算的是靠近光源表面的百分比,而不是在阴影中表面的百分比,具体是多次比较阴影贴图的每个像素,求其平均值。

    且文中对传统的PCF算法做了改进,不再计算阴影贴图空间中被遮挡的区域,只是简单地在各处使用一个4 x 4个texel(纹素)的样本块。这个块应该大到能够有效地减少走样,但是不能达到要求大量样本和随机取样的程度。如下图。

    图 (a)每像素取1个样本 (b)每像素取4个样本 (c)每像素取16个样本

     

    可以看到3幅图中的显示效果区别很明显,图(c)中每像素取16个样本,效果最为出色,达到了反走样的预期。

     

    【本章配套代码汇总表】

    PS:原文中没有对代码片段进行编号,这里的编号为附加。

    Example 11-1 暴风(Brute Force)算法16采样版本的片元程序实现代码

    Example 11-2 阴影贴图反走样的4采样实现版本代码

     

    【关键词提炼】

    反走样/抗锯齿(Antialiasing)

    邻近百分比过滤(Percentage-Closer Filtering , PCF)

    透视阴影贴图( perspective shadow maps)

     

     

    十四、全方位阴影贴图(Omnidirectional Shadow Mapping)

     

     

    【章节概览】

    在这章中,把阴影贴图的思路扩展到正确处理全方位的(点)光源中,其中包括了实现细节,也涉及到基本硬件能力不足时的低效运行策略。

     

    【核心要点】

    首先,这篇文章也谈到了在实时计算机图形学中产生可见阴影的两个流行方法是:

    • 模板阴影(stencil shadows)/ 阴影体(Shadow Volume)
    • 阴影贴图(shadow mapping)

    模板阴影(Stencil Shadows,也被称Shadow Volume,阴影体)作在《Doom 3》中有所应用,优点是得到大量的GPU支持、独立于光源的种类、产生的阴影质量很高。但缺点是严重依赖于CPU,只能产生清晰的影子,需要很高的填充率,而且不能与硬件(hardware-tessellated)的表面一起使用。

     

    阴影贴图(Shadow Mapping,也译作阴影映射)由Lance Williams于1978年引入计算机图形学,文章发布当时多数好莱坞电影都在使用这个方法,包括计算机渲染和特效。为了计算阴影,阴影映射在场景几何体上投射特殊的动态创建的纹理。它可以渲染清晰和模糊的影子,以及由不同类型的光源产生的阴影,它还可以与硬件镶嵌的表面以及GPU动画的网格(例如蒙皮网格)一起使用。

     

    该文章主要介绍了全方位阴影贴图(Omnidirectional Shadow Mapping)方法,该方法有两个主要步骤:

    • 创建阴影贴图
    • 进行阴影投射

     

    在创建阶段,对所有把阴影投射到阴影贴图纹理上的物体,渲染它们到光源的距离的平方。而在投射结算,渲染所有接受阴影的物体,并比较所渲染的像素到光源的距离的平方。以下为全方位阴影映射算法的伪代码:

    for (iLight = 0; iLight < NumberOfLights; iLight++) 
    {     // Fill the shadow map.
         for (iObject = 0; iObject < NumberOfObjects; iObject++)
        {       RenderObjectToShadowMap(iLight, iObject);     }
         for (iObject = 0; iObject < NumberOfObjects; iObject++) 
         // Lighting and shadow mapping.     {       LightAndShadeObject (iLight, iObject);     }
    }

     

    图 Omnidirectional Shadow Mapping @Merlin3d

     

     

    【本章配套代码汇总表】

    Example 12-1 全方位阴影映射算法的伪代码(Pseudocode for the Omnidirectional

    Shadow-Mapping Algorithm)

    Example 12-2 仅渲染深度(Depth-Only Rendering)

    Example 12-3 产生一个软阴影(Making a Softer Shadow)

     

    【关键词提炼】

    阴影渲染(Shadow Rendering)

    阴影贴图(Shadow Mapping)

    模板阴影(stencil shadows)/ 阴影体(Shadow volume)

    全方位阴影映射(Omnidirectional Shadow Mapping)

     

     

     

    The End.

    下次更新,《GPU Gems 1》全书核心内容提炼总结 · 下篇,再见。

    With best wishes.

     

    展开全文
  • GPU Gems 3 中文版
  • GPU Gems 2》这本书除了丰富的内容之外,还有两个特点。首先,《GPU Gems 2》是虚幻引擎之父Tim Sweeney作序。作为Epic Games的创始人,Unreal Engine早期主要开发者,Tim也在序中展示了《GPU Gems 2》出版伊始...
  • GPU Gems 1-3

    2014-07-05 21:23:21
    GPU Gems 1-3 htm格式 高清 文字版
  • GPU_Gems_1(中文清晰带目录版),
  • Gpu Gems 1

    热门讨论 2012-05-24 10:12:55
    Gpu Gems 系列是NVIDIA公司出版的,NVIDIA作为全球一流GPU制造商,其撰写的书籍对一线研发人员具有很高的指导价值。
  • 今天去书店开发票报账的时候,意外发现GPU GEMS 2中文版出来了。这次是清华大学出版社出版的,全彩印,当然价格也不菲,565页定价128块钱啊~~打折100块钱就买到了,看不能报账哦~~~翻开看了看,清华大学出版社的书...
  • https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch08.html 8.1 What Is Diffraction? Most surface reflection models in computer graphics ignore the wavelike effects of natural light. This is fine...
  • GPU GEMS

    2008-08-19 17:35:14
    NVIDA gpu编程
  • Gpu Gems - 2

    2012-05-24 11:06:15
    Gpu Gems 系列是NVIDIA公司出版的,NVIDIA作为全球一流GPU制造商,其撰写的书籍对一线研发人员具有很高的指导价值。
  • 到一个真正的GPU Gems 1和2的是多么困难的一件事情。电驴上的搜索结果都是假的,百度的搜索结果都是寻求。那么GOOGLE呢?GOOGLE给了我一个很好的答案,我从这里找到了需要的书籍:...
  •  本文由@浅墨_毛星云 出品,首发于知乎专栏,转载请注明出处  ...   本文是【GPU精粹与Shader编程】系列的第六篇文章。...《GPU Gems 3》中的“Chapter 14. Advanced Techniques for Realistic Real-...
  • ShaderX1-7(缺4、6) GPU pro1-7, GPUZen,GPU Gems1-3 资源太大给的是链接
  • GPU Gems1 GPU 精粹

    2018-12-06 23:46:50
    GPU 精粹 中文版第一部,懂的人都知道,计算机图形开发必备
  • GPU Gems 2 pdf 清晰版本

    热门讨论 2011-04-26 23:13:34
    GPU Gems2 pdf 清晰版本 英文版本
  • GPU精粹 1 2 3 随书光盘 (gpu gems source code)-附件资源
  • GPU Gems 1 pdf 清晰版本

    热门讨论 2011-04-26 23:08:07
    GPU Gems 1 pdf 清晰版本。(CHM 转PDF过来的)自己再插入个封面再前面,刚好放我IBOOK里面看着舒服。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,863
精华内容 745
关键字:

GPUgems