QUAKE 3源代碼審查:渲染器

QUAKE 3源代碼評論:RENDERER(第2部分,共5部分)>>

Quake III渲染器是Quake II硬件加速渲染器的演變:經典部分是建立在“二進制分區”/“潛在可見集”架構上,但兩個新的關鍵方面是顯着的:

  • 一個基於OpenGL 1.X固定管道的着色器系統。這在1999年是相當成就的。它在現在無處不在的頂點,幾何和片段着色器之前的一個時代提供了大量的創新空間。
  • 支持多核架構:OpenGL客戶機/服務器模型在某些方法上阻塞,線程系統部分消除了此問題。

結構

渲染器完全包含在renderer.lib靜態鏈接中quake3.exe


渲染器的整體構架是Quake Classic:它依賴於着名的BSP / PVS / Lightmap組合:

  • 預處理:
    1. 遊戲設計師使用QRadiant創建並保存.map。
    2. q3bsp.exe通過二進制空間分區對地圖進行切片。我在Quake1渲染器審查中寫了這個。
    3. 在BSP之外,生成門戶系統:我在Doom3 Dmap工具中寫了這個。
    4. q3vis.exe使用門戶系統併爲每次休假生成PVS(潛在可見集)。每個PVS被壓縮並存儲在一個bsp文件中,就像我之前的文章中描述的那樣。
    5. 門戶系統被丟棄。
    6. q3light.exe 計算地圖中每個多邊形的所有照明,並將結果作爲光照貼圖存儲在bsp文件中。
    7. 此時,所有預處理(PVS和Lightmaps)都存儲在.bsp文件中。
  • 運行時刻:
    1. 引擎加載地圖和bsp。
    2. 要求轉載時:
    3. 引擎解壓PVS作爲當前休假,確定實際上是可見的。
    4. 對於每個多邊形,它通過多重打印將光線圖與顏色相結合。

當引擎被修改爲僅顯示一個或另一個引擎時,可以清楚地看到多重貼圖和光照圖步驟:

由水平設計師/藝術家繪製的紋理:由下列生成

的光照圖q3light.exe

通過多紋理在運行時組合時的最終結果:

渲染Brian Hook在1999年遊戲開發者大會上討論了架構。不幸的是,GDC Vault視頻目前正在關閉:(!

着色器

着色器系統建立在OpenGL 1.X固定管道之上,因此非常昂貴。開發人員可以編程頂點修改,但也可以添加紋理過程。這是在“地震3着色器聖經”中描述的:

多核渲染器和SMP(對稱多處理)

對許多人來說是未知的:Quake III Arena 通過cvariable 發送SMP支持 r_smp。前端和後端通過標準的生產者/消費者設計進行通信。當r_smp設置爲1時,繪圖表面交替存儲在位於RAM中的雙緩衝區中。前端(在本示例中稱爲主線程)或者寫入緩衝區之一,而另一個由後端讀取(在本示例中稱爲渲染器線程)。

說明事情如何運作的一個例子:

從t0到t1:

  • 主線程決定繪製和寫入surfacebuffer1的曲面。
  • 渲染器線程正在捱餓,因此鎖定。
  • GPU線程也不做任何事情。

從t1到t2:事情開始移動到整個地方:

  • 主線程正在決定下一幀可見的內容。它將surface寫入surfacebuffer2:這是Double Buffering的典型示例。
  • 同時,渲染器線程使OpenGL調用並耐心等待,直到GPU線程將所有內容複製到安全的空間。
  • GPU線程從Renderer線程指向的地方讀取表面。

請注意,在t2:

  • 渲染器線程仍然將數據傳輸到GPU:SurfaceBuffer1正在使用中。
  • 主線程完成寫入SurfaceBuffer2 ...但無法開始寫入SurfaceBuffer1:它被鎖定

這種情況(渲染器線程鎖定主線程)實際上是玩Quake III時最常見的:它說明了OpenGL API中某些方法的阻止限制,

t2:

  • 渲染器線程一旦完成了SurfaceBuffer1(t3),它就會從SurfaceBuffer2開始抽取曲面。
  • 一旦解鎖(在t3),主線程開始在下一幀工作,寫入SurfaceBuffer1。
  • GPU幾乎不會空閒這個配置。

注意:通過執行同步 Windows事件對象 在 winglimp.c(在底部SMP加速區間)。

下一部分

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章