如何設計一個靈活的遊戲渲染系統?

我目前在開發一個2D遊戲引擎

場景是通過 GameObject 組成的一個hierarchical

GameObject只是邏輯上的層次結構的節點

沒有任何功能 只能確定層次結構

任何其他功能 是通過為GameObject添加組件實現

舉個例子我在GameObject上添加一個所謂的

SkeletalAnimationMeshComponent組件(負責提供骨骼動畫生成的Mesh 這個Mesh可以綁定到下面組件的一個Port上 來為其提供頂點數據)

TextureComponent(這個本身關聯到一個紋理資源id上 用於綁定到材質組件需要的紋理Port上)

MaterialComponent(確定shader 以及提供Shader所需要輸入的一切資源和屬性的Port)

不過GameObject組成的層次結構

實際和渲染Path沒有關係

比如過說 我想先把骨骼動畫人物渲染到一個 RenderTarget 上

然後做一些特效 然後渲染到屏幕

實際問題比這個還複雜

我有很多這種需要這樣渲染的東西

可能都依賴一個RenderTarget

所以更新順序很重要

並且每個渲染 的輸入是什麼 輸出是什麼 輸出到什麼上 都要很明確

而且這個和 GameObject組成的Sence Graph 毫無關係

這樣想來 把所有 需要渲染的東西

都收集起來

然後先對其整理

姑且把完成這個工作的模塊叫做RenderPipline吧

但是現在還是很亂

這個渲染流程的控制 如何 和場景控制有機結合

場景中添加GameObject 又如何在RenderPipline獲得 排列 所有渲染物的渲染Path呢

如何能保證最大的靈活性

關鍵是如何 處理邏輯樹與渲染樹之間的關係呢

思維還是亂的很

不知道如何設計


渲染次序與遊戲對象的數據結構沒有直接關係。

有些引擎有演染層的概念,可被渲染的對象會先做可見性剔除,再按層排序,然後按材質分組渲染,alpha混合材質可能需要按深度排序。相比渲染次序,通常遊戲對象的更新次序會更令人煩惱。

其實每種設計都有局限性,無必要強求非常高的靈活性,只要能滿足實際所需就可以。如果想得到一些啟發,可先參考其他引擎的設計,以至本人的譯作。


看起來像unity...那套component based


也許你應該了解一下基於消息的對象模型?類似objectivec和smalltalk那種。和你腦子裡的對象模型非常相似。

想要分離場景邏輯和渲染邏輯,就需要弄清楚具體在什麼地方切開。對於我來說,在盡量把渲染相關邏輯交給渲染管理函數(比如VBO和索引數組)和shader之後,GL調用自然地就形成了場景邏輯和渲染邏輯的分界。(順便一提,完全可以在2D場景執行深度測試)我不知道你打算在什麼地方切開,但是至少說明白吧。


pipeline拼錯:)


推薦閱讀:

TAG:遊戲 | 編程 | 遊戲引擎 | 遊戲開發者 | 3D渲染 |