寫在前面#
本專欄內容均為學堂在線慕課《3D 遊戲引擎架構設計基礎》中的內容。個人將其轉化成文字和圖片的版本(個人更加喜歡文字版本的教程,閱讀速度更快很多),方便查閱。
原課程鏈接:3D 遊戲引擎架構設計基礎。
場景渲染#
渲染概述與剔除方法#
渲染的定義:將三維矢量描述的場景轉換到二維像素描述的場景的處理過程,是整個遊戲引擎功能模塊是最重要的內容。
相關的概念描述包括:
為了提升渲染的效率,可以採用不可見物體剔除,包括:
-
根據攝像機位置,剔除視見體外的物體(可以通過包圍體)
-
判斷視見體中物體的遮擋關係,剔除被遮擋的物體(可以通過包圍體)
-
剔除可見物體的背面
真實感渲染中,包括以下內容的計算和融合得到渲染結果。
-
光照,指根據場景定義的燈光、材質等屬性,用圖形庫支持光照模型渲染場景。其中光照模型包括:局部光照模型,全局光照模型,光照繪製算法等,光照計算通過光源、三角形面片的頂點法向量和材質等屬性計算。光源是不可渲染的,只是作為計算真實感場景的屬性,本身不被渲染。
-
紋理:紋理映射是增加場景網格模型真實感表現效果的方法。紋理是由像素表示的,是以貼圖映射的形式與網格模型關聯起來,其紋理涂是一種資源文件。如.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 主渲染流程:
其中的幾個子過程如下:
- 異步任務驅動渲染的流程:
- 多線程渲染:
- 剔除操作
- 渲染操作