常见的三维引擎
三维引擎按平台可分为客户端三维引擎,Web端三维引擎;按用途可分为游戏三维引擎、CAD/CAM/CAE三维引擎;
游戏引擎常见的有UE4、Unity3D;CAD工程用的三维引擎又分商用的还有开源的,商用的比较著名的有ACIS、ParaSolid;开源的有OCCT;这些三维引擎都是基于DirectX或OpenGL等底层之上构建的;他们才能真正意义上的三维引擎;而OpenGL与DirectX只能称得上是图形绘制接口
而Web端的三维引擎主要有Three.js、Babylon.js、Cesium.js等,这些B端的三维引擎几乎基于WebGL而开发的三维引擎,而webGL又是OpenGL ES的B端API封装集;这些B端引擎他们都有各自的应用场景,比如Three.js用于做效果展示、Babylon.js用于游戏开发,Cesium.js用于GIS开发;
底层图形库
Direct3D和OpenGL是图形渲染的API,对硬件层的一些封装,通过这套API应用层可以控制GPU进行图形的绘制渲染,使调用者无需关心CPU怎么调用GPU,GPU怎么分配内存,怎么异步处理代码等等。
简单来说DirectX功能比OpenGL强大,OpenGL主要是一个图形绘制库;从图形绘制技术的角度来说,他们都是相对底层的技术;可以直接使用作为3D引擎使用,但是跟多时候,应用软件不会直接基于他们开发软件。而是基于专用的三维引擎而开发。比如基于UE4三维游戏引擎开发一款游戏;基于ACIS CAD三维引擎而开发一款CAD三维制图软件等。
3D图形渲染管线(3D graphic rendering pipeline)
渲染技术
渲染是 3D 制作流程的最后阶段之一。可以将其视为将场景中的所有信息(对象、材质、灯光、相机)组合在一起,以生成单个或一系列最终渲染图像。这部分制作通常需要大量计算,有时可能需要数小时——具体取决于场景的复杂性、质量和预期平台。
图形学渲染风格主要分为真实感渲染(Photorealistic rendering)和非真实感渲染(Non-photorealistic rendering,NPR)两大类。真实感渲染目的在于渲染出相片级别的画面真实感,而非真实感渲染的目的更加的多样,主要在于模拟艺术化的绘制风格,呈现出手绘的效果。
目前有两种从3D场景创建2D图像的主要方法:分别是光栅化和光线追踪。
光栅化从计算机生成图形的第一天起就已经存在,计算机将场景中的所有对象分成三角形,计算它们在屏幕上的位置,并覆盖上一个像素网,然后根据材料和透明度决定每个像素的颜色。当您需要清楚地看到场景中的所有内容,并了解前面和后面的内容时,光栅化算法就十分有用。3D 软件中的视口使用光栅化来显示创建的几何体,然而当涉及到光照和阴影时,光栅化一般显示效果类似于“猜测”,这导致我们的结果看起来就不太真实了,所以还有许多额外的算法可以增加真实感;光栅化是一种常用于实时图形的渲染技术。
光线追踪技术指的是创建物理上正确的图像,它模仿的是我们的大脑如何为我们构建图像的过程:光线撞击表面并从表面反射,具体取决于材料,它改变了光线的属性,所以当我们的眼睛捕捉到它时,它会被感知为具有特定的颜色。通常,光线追踪器的方向相反:光线从相机(我们的视点)射向物体,当光线撞击表面时,它会反弹(或者如果表面是透明的则穿过)并产生其他几条光线,这些新光线撞击其他表面并反弹等等,直到到达光源,然后最后一条光线采用此光源的属性并将此信息沿线返回,计算每个反弹点的颜色。光线追踪是一种递归算法,导致一次完成大量计算,因此每次反弹产生的新光线数量有限,然而随着硬件技术的发展,光线追踪渲染器已经能够越来越好地创建与现实难以区分的视觉效果,所以也被广泛用于电影和建筑可视化。光线追踪是当今最常用的逼真渲染方法。
实时渲染和非实时渲染
3D 实时渲染
实时渲染主要应用在游戏领域,电脑会实时的计算和展示所渲染的结果,帧率在 20-120 频率左右。因此需要在帧率一定的情况下最大化的展示真实性。计算机在图像处理的过程中会用到一些”技巧“是肉眼感官为”真实“世界,这些”技巧“都包括镜头光晕(lends flare),景深(depth of field)和动态模糊(motion blur)。计算机的算力决定了渲染的真实感,通常需要 GPU 来协助完成。
3D 非实时渲染
3D 非实时渲染通常是电影或视频,借助计算机有限的算力,通过延长渲染时间达到更加真实的效果。射线追踪(ray tracing)和辐射度算法(radiosity)是非实时渲染常用的技巧,以达到更加真实的感觉。随着技术的发展,不同种类的物质形式有了更精确的计算技巧,例如粒子系统(模拟雨,烟和火),容积取样(模拟雾,灰尘),以及焦散性质和子面散射(subsurface scattering)。渲染过程中不同层的物质是分开计算后合成为一个最终布景。
渲染相关的光学原理
全局照明 (Global Illumination)
除了 3D 布景中的设置的基础照明外,全局照明考虑到不同物质之间反射的光,叠加计算到渲染过程中,使之更加真实。
射线追踪(Ray Tracing)
在渲染过程中,通过相机这个媒介定位到与 3D 布景中物体的关系的。因此「相机」是眼睛的位置。类似现实世界中物体是因为光打到物体上,然后反射到眼睛里,射线追踪是与此反向的倒推过程。由图所示,Camera 发射的光线 View Ray 通过屏幕的像素点(每一个像素点均得到计算)打到 3D 布景的物质 Scene Object 上,通过计算物质的反射指数反推回光源 Light Source , 这样每个像素点都可以得到一个计算结果,以展示所在位置的相关视觉信息。
冯氏着色(Phone Shading)
在光照模型中,主要由三部分组成:环境光(ambient),漫反射(diffuse),镜面反射(specular)。不同的材质会根据光的不同而呈现出不同的视觉信息。
物体材质和纹理 (Object Texture)
和渲染相关的物理性质包括液体的稠度,对光的折射度以及反射度,材料本身的厚度,表层的纹理粗糙度等等,这些参数影响了光的走向以及强弱,使计算变得多维。BRDF(双向反射分布函数)就是用于描述入射光和经过物体反射及折射后光的关系。
References
3D 渲染 - 知乎