banner
Olimi

Olimi

SCUT 小菜鸡
github
bilibili

3D遊戲引擎入門課程4——場景渲染

寫在前面#

本專欄內容均為學堂在線慕課《3D 遊戲引擎架構設計基礎》中的內容。個人將其轉化成文字和圖片的版本(個人更加喜歡文字版本的教程,閱讀速度更快很多),方便查閱。
原課程鏈接:3D 遊戲引擎架構設計基礎

場景渲染#

渲染概述與剔除方法#

渲染的定義:將三維矢量描述的場景轉換到二維像素描述的場景的處理過程,是整個遊戲引擎功能模塊是最重要的內容。

相關的概念描述包括:
在這裡插入圖片描述
為了提升渲染的效率,可以採用不可見物體剔除,包括:

  • 根據攝像機位置,剔除視見體外的物體(可以通過包圍體)

  • 判斷視見體中物體的遮擋關係,剔除被遮擋的物體(可以通過包圍體)

  • 剔除可見物體的背面

真實感渲染中,包括以下內容的計算和融合得到渲染結果。

  • 光照,指根據場景定義的燈光、材質等屬性,用圖形庫支持光照模型渲染場景。其中光照模型包括:局部光照模型,全局光照模型,光照繪製算法等,光照計算通過光源、三角形面片的頂點法向量和材質等屬性計算。光源是不可渲染的,只是作為計算真實感場景的屬性,本身不被渲染。

  • 紋理:紋理映射是增加場景網格模型真實感表現效果的方法。紋理是由像素表示的,是以貼圖映射的形式與網格模型關聯起來,其紋理涂是一種資源文件。如.jpg,.tga,.bmp,.png,.tif 等,可以與光照、陰影、特效等產生混合效果。紋理映射方法包括:多重紋理、凹凸紋理、光澤紋理、投影紋理、環境紋理等。

  • 陰影,可以產生場景深度和立體效果。陰影區域就是,在視點位置看是可見區域,但在光源位置看是不可見區域,示意圖如下:

在這裡插入圖片描述

其中軟陰影的概念為:如果是面光源照射物體,則影子區域呈現為軟陰影,即陰影由全陰影區和半陰影區組成,示意圖如下:

在這裡插入圖片描述

  • 視覺特效,可以產生動態光影效果,一般用布告板或粒子系統等實現。
    渲染實現的重要部分:GPU 和著色器編程:
    在這裡插入圖片描述
    其對於遊戲引擎的要求:
    在這裡插入圖片描述
  • LOD

LOD(Level of Detail)是指渲染時,使用較少的細節表示較小的、較遠的或不太重要的場景物體。實現方法包括:離散 LOD(靜態 LOD),連續 LOD(動態 LOD)和視點依賴 LOD 等。

場景渲染實例#

OGRE 場景渲染#

OGRE 主渲染循環:

在這裡插入圖片描述
OGRE 主渲染時序圖:
在這裡插入圖片描述
OGRE SceneManager 類的渲染操作:

  1. **SceneManager::_renderScene(Camera camera, Viewport vp, bool includeOverlays)
    在這裡插入圖片描述

  2. SceneManager::_renderVisibleObjects(void)
    在這裡插入圖片描述

  3. SceneManager::renderVisibleObjectsDefaultSequence(void)
    在這裡插入圖片描述

  4. *SceneManager::_renderQueueGroupObjects(RenderQueueGroup pGroup, QueuedRenderableCollection::OrganisationMode om)
    在這裡插入圖片描述

  5. *SceneManager::renderBasicQueueGroupObjects(RenderQueueGroup pGroup, QueuedRenderableCollection::OrganisationMode om)
    加粗樣式在這裡插入圖片描述

  6. SceneManager::renderObjects(...);
    QueuedRenderableCollection::acceptVisitorGrouped(...)
    QueuedRenderableCollection::acceptVisitor(...);
    在這裡插入圖片描述

  7. **SceneManager::SceneMgrRenderableVistor::VISIT(Pass p, Renderable r);
    在這裡插入圖片描述

  8. SceneManager::renderSignleObject(...)
    在這裡插入圖片描述

  9. SceneManager::_issueRenderOp(...)
    GLRenderSystem::_render (RenderOperation &op)// 使用 OpenGL 渲染
    在這裡插入圖片描述

以上 Step 總結:

在這裡插入圖片描述

Panda3D 場景渲染#

Panda3D 渲染過程:

在這裡插入圖片描述

Panda3D 渲染核心類和類關係:
在這裡插入圖片描述

下面是幾種 Panda3D 場景渲染的核心類詳細描述:
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

Panda3D 渲染管理:

  1. 應用程序啟動渲染;

  2. 對於視見體,剔除不可見物體,建立渲染隊列和狀態,並排序;

  3. 執行渲染,獲得一幀渲染結果

  4. 應用程序更新場景,循環開始下一幀渲染,轉 2.

Panda3D 主渲染流程:

在這裡插入圖片描述
在這裡插入圖片描述

其中的幾個子過程如下:

  1. 異步任務驅動渲染的流程:
    在這裡插入圖片描述
  2. 多線程渲染:
    在這裡插入圖片描述
  3. 剔除操作
    在這裡插入圖片描述
  4. 渲染操作
    在這裡插入圖片描述
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。