【Games104】 游戏引擎中的渲染实践

一、渲染系统的对象

首先确定渲染系统的对象。宽泛的来讲,就是确定图形的各个顶点,然后将各个顶点连成多个面,之后进行光栅化(Rasterize)将三角形对应上各个像素,进一步进行着色(Shader)对各个像素进行着色处理最终输出成为图像。

在Rasterize之前通常要先将空间中的物体进行投影,不管是正交投影(Orthographic projection)还是透视投影(Perspective projection)得到屏幕空间中的形状,之后再进行光栅化。

之后进行shader,不管是计算phong模型还是其他都需要进行大量的常数的访问、变量的访问、加减乘除的运算,再加上texture的访问才能得到想要的结果。其中texture采样纹理的过程可能会特别的复杂昂贵,当采样一个像素的texture需要采样两层的纹理,再进行插值(假如每层需要采样4个点,则总共需要进行7次插值),整个过程需要大量的数学运算。

二、可渲染的物体

游戏中的大部分物体都是Game Object(GO),而这只是逻辑上的表达,与这里提到的可绘制(Renderable)的物体加以区分。GO是由组件(Component)组成的,当一个组件存储Renderable,我们才能去绘制它,所以这个Renderable才是我们需要绘制的对象。

一个Renderable的构成通常包括网格(Mesh)、材质(Material) 、纹理(Texture)等。构建一个Mesh,我们通常先需要进行对每个三角形的定义,包括顶点、颜色、法线等,如果将每个三角形都进行存储这样显然是十分笨重的。当今的方法通常运用Vertex Data(存储顶点)和Index Data(存储三角索引)进行存储,由于大部分的顶点都是多三角形公用的,这种存储方式能将存储效率提升六倍以上。

这里有一点注意的是,我们在定义顶点的时候都要给顶点定义一个法线方向。这样就可以避免在生成硬表面(明显折痕,两个面的顶点重合)的时候产生错误。

 除了材质和纹理,Shader的作用也十分重要。Shader是一小段代码,目的就是告诉计算机需要将哪种材质哪种纹理绘制在一起,这也是Renderable必要的数据。

之后我们会发现,一个模型不能单单由一种材质构成,现代引擎的做法是将整个模型的Mesh划分成多个Submesh,每个Submesh都能单独调用一个Shader。

当然,在庞大的GO数量下,每个模型如果都需要单独存储Submesh会大大的浪费空间。实际设计游戏我们会发现,大部分的材质都是相同的,因此现代引擎会给出一种资源池(Resource Pool) 来解决这个问题。不管是Mesh、Shader还是Texture,我们都分类存放在对应的资源池当中,在使用的时候直接调用,这样就可以以最小的空间进行存储。

这里提到了一个细节,在使用GPU加载场景的过程中,相同材质同时加载的速度往往快于按其他顺序加载,即使计算量相同,但是按照材质进行排序加载往往会有更好的加载效果。

三、可见性裁剪

可见性裁剪(Visibility Culling)是绘制系统最基础的一个部分。我们可观察的空间是一个锥形, 实际上我们只需要加载在这个锥形之内的GO即可。现在最常用的方法是BVH,这个方法虽然并非查找最高效的,但是现在游戏会有很多运动的GO,我们要去不断构建树,所以更应该追求构建和查询相平衡的方式。

还有另一个重要是思想是PVS(Potential Visibility Set),这个思想最开始是用于作可视化的,现在很少这么做,但是对于资源加载,这个思想仍然是高效的。简单来说,我们会将一个世界分成多个区域,如果能在当前区域观察到其他区域,则同样需要加载那些区域。

随着GPU的高速发展,GPU-based往往是最高效的。这里提到了一种Occlusion Culling的做法,场景中的物体因被遮挡对于当前摄像机为不可见时,可以不对其进行渲染。要注意与视锥体剔除进行区分,视锥体剔除是不渲染摄像机视锥范围之外的物体,被其它物体遮挡但仍在视锥范围之类的物体不会被剔除。使用遮挡剔除时视锥体剔除依然有效。 

四、纹理压缩

存储纹理时需要进行纹理压缩,然而这个压缩过程不能用常见的高效的压缩算法,因为那些算法得出的数据无法进行随机访问。这里提出了一个非常经典的压缩算法Block Compression,即在每个块中存储最亮的颜色和最暗的颜色,以及每个点离最大值\最小值近的比例关系,近似的去表示这个色块的颜色。这种算法是非常高效的,通常可以保证实时性。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Unreal渲染引擎是由Epic Games开发的一款强大的游戏和虚拟现实应用程序的3D渲染引擎。其架构是基于一系列核心模块和子系统,用于处理图形渲染、物理仿真、动画、声音等方面。 在Unreal渲染引擎的架构,最核心的模块是Render Core,负责管理图形渲染的整体流程。它将渲染任务划分为一个个渲染线程,通过使用多线程并行处理,提高整体渲染性能。在这个模块,还包含了对图形API的封装,用于与不同的图形硬件进行交互。 另一个重要模块是Scene Management,用于构建和管理场景的对象。通过使用场景图的数据结构,这个模块可以高效地管理复杂的场景,并支持可视化编辑和实时预览。它还包括了空间分区提高场景对象查询的效率,并提供了灯光、阴影、镜面反射等效果的支持。 为了实现真实的光照效果,Unreal渲染引擎还有一个独立的Lighting模块。这个模块使用了先进的光线追踪和辐射传输算法,并支持动态光源和全局光照。通过提供高质量的光照和阴影效果,使得场景更加逼真和细腻。 此外,Unreal渲染引擎还有许多其他模块,如Animation、Physics、Audio等,用于处理游戏的动画、物理仿真和声音效果。这些模块都与核心模块紧密合作,共同构建出一个功能强大、性能优越的渲染引擎。 总结来说,Unreal渲染引擎的架构是基于一系列核心模块和子系统构建的。通过高效的多线程渲染、复杂的场景管理、先进的光照算法等功能,它能够提供逼真、流畅的游戏和虚拟现实体验。 ### 回答2: Unreal渲染引擎是一种先进的3D渲染引擎,用于创建高质量、逼真的虚拟世界和游戏环境。它采用了先进的图形技术和渲染算法,具有高度的可定制性和灵活性。 Unreal渲染引擎的架构是基于现代的渲染管线和算法构建的。它包括以下几个关键模块: 1. 场景管理:这个模块负责管理和渲染场景的各种元素,包括物体、光照、材质等。它维护了一个场景图,用于高效地组织和管理场景的对象。 2. 光照和阴影:Unreal引擎支持多种光照和阴影算法,包括实时光照、全局光照、阴影映射等。这些算法能够提供逼真的光照效果,并生成高质量的阴影。 3. 材质和纹理:Unreal引擎提供了一个强大的材质系统,用于创建和调整物体的外观。它支持复杂的纹理映射、反射、折射等特性,使物体看起来更加真实。 4. 特效和后期处理:这个模块负责添加各种特效和后期处理效果,如雾化、景深、色彩校正等。它可以增强场景的真实感,并提升图像的质量。 5. 渲染优化:Unreal引擎提供了多种渲染优化技术,用于提高渲染性能并减少资源消耗。这些技术包括级别LOD(细节层次)管理、延迟渲染、遮挡剔除等。 总的来说,Unreal渲染引擎的架构设计旨在提供灵活、高效、逼真的渲染技术,以满足不同类型游戏和虚拟世界的需求。它具有丰富的功能和工具,使开发者能够创造出惊人的视觉效果,并为用户提供极致的游戏体验。 ### 回答3: Unreal渲染引擎是由Epic Games开发的一款高效的游戏和虚拟现实渲染引擎。 Unreal渲染引擎的架构是基于场景图的,它采用了现代的图形技术和算法来实现逼真的实时渲染。其核心架构包括三个组件:场景图、渲染管道和渲染资源。 首先,场景图是一个层次化的结构,用于组织和管理游戏场景的对象和模型。它包括了场景的物体、光源、相机等元素。在实时渲染,场景图的变动会直接影响到最终的渲染结果。 其次,渲染管道是Unreal渲染引擎的核心模块,负责处理图形数据的传递和处理。它由多个阶段组成,包括几何处理、光栅化、像素处理等。在每个阶段,渲染管道会对场景图的数据进行处理和转换,然后将结果传递给下一个阶段,最终生成最终的渲染图像。 最后,渲染资源是用于存储渲染相关的数据和纹理的组件集合。它包括了模型、材质、纹理等各种资源,这些资源会被渲染管道使用和处理。渲染资源的高效管理和使用是保证渲染性能和效果的重要因素之一。 总之,Unreal渲染引擎的架构是基于场景图的,它使用先进的技术和算法来实现逼真的实时渲染。通过合理的组织和管理场景图的元素,经过渲染管道的处理,结合高效的渲染资源,Unreal渲染引擎能够提供出色的渲染效果和性能,为游戏和虚拟现实应用提供强大的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值