3D游戏引擎入门课程4——场景渲染

场景渲染

渲染概述与剔除方法

渲染的定义：将三维矢量描述的场景转换到二维像素描述的场景的处理过程，是整个游戏引擎功能模块是最重要的内容。

相关的概念描述包括：

为了提升渲染的效率，可以采用不可见物体剔除，包括：

根据摄像机位置，剔除视见体外的物体（可以通过包围体）

判断视见体中物体的遮挡关系，剔除被遮挡的物体（可以通过包围体）

剔除可见物体的背面

真实感渲染中，包括以下内容的计算和融合得到渲染结果。

光照，指根据场景定义的灯光、材质等属性，用图形库支持光照模型渲染场景。其中光照模型包括：局部光照模型，全局光照模型，光照绘制算法等，光照计算通过光源、三角形面片的顶点法向量和材质等属性计算。光源是不可渲染的，只是作为计算真实感场景的属性，本身不被渲染。

纹理：纹理映射是增加场景网格模型真实感表现效果的方法。纹理是由像素表示的，是以贴图映射的形式与网格模型关联起来，其纹理涂是一种资源文件。如.jpg,.tga,.bmp,.png,.tif 等，可以与光照、阴影、特效等产生混合效果。纹理映射方法包括：多重纹理、凹凸纹理、光泽纹理、投影纹理、环境纹理等。

阴影，可以产生场景深度和立体效果。阴影区域就是，在视点位置看是可见区域，但在光源位置看是不可见区域，示意图如下：

其中软阴影的概念为：如果是面光源照射物体，则影子区域呈现为软阴影，即阴影由全阴影区和半阴影区组成，示意图如下：

视觉特效，可以产生动态光影效果，一般用布告板或粒子系统等实现。
渲染实现的重要部分：GPU 和着色器编程：

其对于游戏引擎的要求：

LOD

LOD（Level of Detail）是指渲染时，使用较少的细节表示较小的、较远的或不太重要的场景物体。实现方法包括：离散 LOD（静态 LOD），连续 LOD（动态 LOD）和视点依赖 LOD 等。

场景渲染实例

OGRE 场景渲染

OGRE 主渲染循环：

OGRE 主渲染时序图：

OGRE SceneManager 类的渲染操作：

SceneManager::_renderScene(Camera *camera, Viewport *vp, bool includeOverlays)

SceneManager::_renderVisibleObjects(void)

SceneManager::renderVisibleObjectsDefaultSequence(void)

SceneManager::_renderQueueGroupObjects(RenderQueueGroup *pGroup, QueuedRenderableCollection::OrganisationMode om)

SceneManager::renderBasicQueueGroupObjects(RenderQueueGroup *pGroup, QueuedRenderableCollection::OrganisationMode om)
加粗样式

SceneManager::renderObjects(...);
QueuedRenderableCollection::acceptVisitorGrouped(...)
QueuedRenderableCollection::acceptVisitor(...);

SceneManager::SceneMgrRenderableVistor::VISIT(Pass *p, Renderable *r);

SceneManager::renderSignleObject(...)

SceneManager::_issueRenderOp(...)
GLRenderSystem::_render (RenderOperation &op)// 使用 OpenGL 渲染

以上 Step 总结：

Panda3D 场景渲染

Panda3D 渲染过程：

Panda3D 渲染核心类和类关系：

下面是几种 Panda3D 场景渲染的核心类详细描述：

Panda3D 渲染管理：

应用程序启动渲染；

对于视见体，剔除不可见物体，建立渲染队列和状态，并排序；

执行渲染，获得一帧渲染结果

应用程序更新场景，循环开始下一帧渲染，转 2.

Panda3D 主渲染流程：

其中的几个子过程如下：

异步任务驱动渲染的流程：

多线程渲染：

剔除操作

渲染操作