写基于图形API(如WebGL)的引擎主要考虑的设计因素有哪些?

比如Three.js, SceneJS, BabylonJS, 主要会考虑哪些设计要素,主要实现哪些功能?
关注者
177
被浏览
6331
好久没在知乎上认真写答案了,刚好最近半年时间的主要工作就是基于WebGL的渲染引擎的开发,所以可以简单分享我的看法。
首先想说的是引擎和图形API的关系,图形API相对于引擎来说是工具,所以说渲染引擎的核心不会是工具,而是如何用工具设计出相应的功能,因此我觉得API只需熟悉即可,熟悉的程度大致是了解每个API的功能,基本用法,并且对相应的开销有一个大致的概念。至于细节可在用的时候查工具书或者文档。譬如我现在基于WebGL2.0的标准开发,这部分的资料比较少,但可以大致对应到OpenGL ES3.0的API特性,因此可以基于OpenGL ES3去了解WebGL2,这里推荐一本书:《OpenGL ES 3.0编程指南》,目前应该是第二版,作为工具书非常实用。
对API的学习和了解可以是渐进式的,核心还是在于图形学的算法和你在引擎开发之初希望你的引擎是什么样的,拥有什么功能,核心优点是什么,根据功能需求再去选取API加以利用,所以多读图形学相关的PAPER,关注SIGGRAPH,GDC这些图形和游戏的顶会是更为重要的事,通过实现功能去理解API的设计思路和用法,往往体会更深入。譬如在学习图形之初,很多人都不理解Stencil Buffer,但是通过学习Shadow Volume的算法,就能比较深入的理解它,再譬如glsl中的discard命令(hlsl的clip)可以通过了解alpha test来学习。实时图形算法几乎都是基于现代的图形API来实现的,而这些图形API设计思路大同小异,通过了解这些算法的实现,也就同时了解了相应API的用法。
不同引擎因为设计之初的需求不同,因此可能在功能的规划上也有区别,不过总体来说都会有一部分核心功能大家比较相似,另外的高级功能和定制功能可能会有较大差别。

核心功能部分大概包含了基本的场景概念,场景的层次结构,摄像机,场景的遍历、剔除、光照、阴影、鼠标拾取、动画、材质系统、渲染结构的实现。
基本的场景管理部分是整个渲染数据架构的核心,一定程度决定了引擎渲染的方式,同时也很大程度决定了渲染在CPU端的提交效率,这部分可做的优化比较多,譬如用一些数据结构(BSP,OCTree)加速场景的遍历,视锥剔除,遮挡剔除,LOD,材质排序等都能够有效的提升引擎渲染效率,也是往往被忽略的部分,这部分在每年的相关会议上提的也比较少,叶老师翻译的《游戏引擎架构》和《3D Game Engine Design》里面有涉及部分,GPU Gems中也有一些文章谈及。
光照、阴影和渲染架构也是渲染引擎的核心功能,近年来延迟渲染(Deferred Rendering)是比较流行的渲染架构,在其基础上衍生出了Tile Based Deferred Shading以及更进一步的Clustered Shading,如果基于前向渲染则可以考虑Forward+的技术;在光照模型方面,近年来大家已经不同程度趋向于基于物理的渲染(PBR),从2012年左右开始在各大会议上每年都有相关议题的分享;阴影也是非常重要的功能,主要的问题是阴影质量、软阴影的模拟、多阴影的管理和阴影性能几个方面,比较重要的几个成果包括PSSM,SDSM(旨在提升阴影质量),Variance Shadow Map(旨在模拟软阴影),《Real Time shadows》这本书对于阴影技术有一个详细的汇总,至于多阴影和阴影性能方面,则需要通过阅读一些商业引擎在阴影方面的具体实现来找到灵感,这里推荐toughBro博客里的一篇导读及其原文:[sig12]几个AAA游戏中的阴影技术;动画部分也是较大的课题,不过每年也都有文章提及,内容较杂,比较重要的动画类型包括骨骼动画和Morph动画,以及结合物理引擎的RagDoll(实际上也是骨骼动画)。

高级功能
或许称之为扩展功能更恰当,这部分功能并非必要,实现也依据引擎特点各有不同,主要是为渲染效果加分,用于渲染一些特殊的材质和效果或者后处理特效,比较重要的特殊材质包括半透明物体的渲染(depth peeling,alpha to coverage,per pixel linked list),水体的渲染(Simulating Ocean Water,Jerry Tessendorf;Real-time water rendering:Introducing the projected grid concept),皮肤的渲染(GPU Gems3,Advanced Techniques for Realistic Real-Time Skin Rendering),毛发的渲染(GPU Gems2, Hair Animation and Rendering in the Nalu Demo;An Energy-Conserving Hair Reflectance Model),植被的渲染(GPU Gems3, Vegetation Procedural Animation and Shading in Crysis),天空的渲染(Precomputed Atmospheric Scattering;GPU Gems 2, Accurate Atmospheric Scattering),云彩的渲染(The Real-time Volumetric Cloudscapes of Horizon: Zero Dawn);此外还有一些常用的后处理特效(CryENGINE 3 Graphics Gems - Crytek),例如SSAO(HBAO,Alchemy AO, Scalable AO,SSDO),DOF,HDR(HDR the Bungie way, Uncharted2 HDR Lighting),Volumetric Light(GPU Pro 5, Volumetric Light Effects in Killzone Shadow Fall;Frostbite PB and unified volumetrics),Motion Blur(Next Generation Post Processing in Call of Duty Advanced Warfare),FXAA,Temporal AA等,这部分比较杂,需要根据自身引擎的特点、需求以及机能条件做灵活的选取,没有一个统一的方案。

其它部分就是一些细节的优化了,这部分细节更多,零零星星也有一些资料,暂时就不赘述了。

以上大概是我能想到的一些内容,等有空的时候可以再整理文章的引用和资料补全。