如何用OpenGL封裝一個2D引擎?

想用OpenGL封裝一個2D遊戲引擎,計劃底層用C++,上層用Lua。最好跟windows遊戲編程大師技巧里的類似。

---2016-08-20更新---

問題更新,之前的小問題已經解決了。目前想請教各路大神,怎麼去構架(architect)一個實用的2D引擎,一般需要哪些核心類,實現哪些功能。有啥思路,資料可以提供參考哈。韋易笑大神的回答很有啟發性,但我想知道的更詳細一點,請大家幫幫忙。


不寫圖形好多年,但掃了一眼你的代碼,見你這樣就想 「封裝一個2D引擎」 了?還是十分驚訝:

1. 別用什麼 glBegin/glEnd,至少寫兼容GLES2代碼,不然手機上跑不起來。

2. 打算用點來拼湊出一個個點陣圖來么?這樣還不如直接用gdi,它更適合你。

3. 你得用兩個三角形的紋理拼湊出一個2D的圖塊出來,不是搞啥每個點自己畫。

4. 2D圖像庫基本就是要把顯示對象樹給做出來就得了。

5. 每個顯示對象除了自己外還有很多兒子節點。

6. 每個顯示對象有一個變換矩陣,用來設置位置和角度還有縮放,最後是節點的顯示效果。

7. 渲染的時候需要從遠到近排序,並盡量歸併相同效果(fs)及紋理。

8. 把常用紋理管理起來,提供資源載入,可以換進換出,提供類 LRU的機制。

9. 在此基礎上提供一些動畫(精靈)和場景控制的api,提供顯示字體,即可。

最後問一句,你看的都是些幾百年前的書啊?

先找兩個現成的輕量級2D引擎讀讀吧:

StarEngine:GitHub - StarEngine/engine: Crossplatform C++11 2D Game Engine for Desktop and Mobile games

EJoy2D:GitHub - ejoy/ejoy2d: A 2D Graphics Engine for Mobile Game

----


我學OpenGL時曾經做過一個HGE的OpenGL Port:GitHub - funcman/bsgl: A OpenGL port of HGE.

當然這種Port很多啦。我這個目前有點問題,回頭有時間再把Bug修了。只是告訴你實現起來很簡單。

另外,如果你想做夢幻西遊這種遊戲,其實基於3DAPI的Sprite2D引擎(包括cocos2d系列)不是特別好的選擇。

首先序列幀動畫數據最好的壓縮演算法是調色板+RLE,但是3DAPI不適合直接渲染這樣的數據。

而壓縮紋理會導致序列幀動畫出現明顯的噪點感。

在MMO遊戲開發中,這尤其是個問題,巨量的換裝可能撐爆顯存。讓你不得不寫複雜的調度代碼。

所以純2D MMORPG選擇CPU渲染的佔主流。

2D這塊,CPU最基本的東西是blit,GPU最基本的是Sprite封裝類。你拿glVertex畫點,實在是問題很大。

怎麼選擇。關鍵看你做什麼遊戲,規模多大。像Isometric遊戲,不只是將精靈繪製上去就完事,還涉及遮擋排序。遮擋排序其實很簡單,不過網上大多數文章介紹的都基於Isometric tile的。2D Isometric Tile引擎其實是深坑,會搞得很複雜。除非要想實現大菠蘿2那樣的動態光影,或者複雜的GamePlay,不然我想不出Tile的意義。

講這麼多,其實最想說的,搞什麼2D,2D已經完全沒意義了。搞著玩不攔你,有興趣,繼續互動聊。


先把ogl學好,glbegin從3.x開始就已經被淘汰的了,你還用。

找幾本講圖形學的書,有助於你實現一些特效。

學好各平台上的窗口管理。sdl很不錯,但並不是最好的選擇。

學一些工程技術,多線程,場景資源管理,碰撞檢測什麼的。

好了,現在你有資格去做2D引擎了。


建議樓主去看看libgdx的graphics部分的源碼,還有其作者寫的一本書叫《Android4遊戲編程入門經典》,書中有講如何封裝一個圖形(遊戲)引擎(算是libgdx的雛形吧),還有很多關於OpenGL ES 2d/3d的開發技巧。

github:https://github.com/libgdx/libgdx


難度很大 如果實現vg


https://github.com/wubugui/WIP

大學寫的,GL是glfw+glew也是不管效率只圖個畫出了就好了,哈哈哈,後來想改,但是一直沒時間,就這麼算了。

渲染的大致思想就是簡單地用一個四邊形來畫Sprite,包含各種屬性。幀動畫就是變圖就好了。

平台問題,當時可以成功在OSX上跑,想過一直安卓和IOS,後來想想有點糟心,意義不太大,就作罷了。

基本上你問的東西都有勉強的實現,代碼也很簡單。

本來想再維護的,後來工作忙就作罷了。所以該有的東西都沒有,大神勿噴。


點陣圖是2個三角形+1個紋理貼圖啊,你怎麼把它全變成點來來畫的

就算畫點也不對,我記得glColor4f的參數值域是0-1.0f

去讀cocos2dx源代碼

雖然有這種那種的吐槽和問題,但是相信我,10個吐槽的人當中,

有1個能自己實現一個cocos2dx就已經算多了

還有,記得要用gles,不然跨平台是個問題

或者去用用sdl也不錯,至少知道一點基本知識再開始


最簡單的辦法,通過C#學習一下GDI+,然後把他所有的功能都實現出來,介面都長得差不多,你就得到一個2D引擎了。


不知道lz究竟是想做遊戲還是做引擎

這個你要想清楚,因為是兩條不同的路線,都需要非常多的時間去鑽研,你很難兼顧的,別弄成個半吊子(尤其是專攻引擎的,其實很枯燥)

如果確定要做引擎,可以參考一下gamemaker或者rpgmaker,至少你的引擎要能夠實現他們提供的功能才算是一個合格的引擎,說難不難,說簡單不簡單,其實很多所謂的引擎在我看來根本就算不上引擎,頂多就是把一些函數封裝了一下。。。我還不如用gdi呢

源碼方面則可以參考osg,ogre等成熟開源引擎

如果你要做遊戲,我推薦直接用人家流行的商業引擎,比如unity3d

如果你只是想做一個同人遊戲,我覺得rpgmaker都夠了。。。


看題主的描述,我建議先學會用一個2D引擎做點小東西,了解一下引擎能給你提供什麼內容再去實現自己的引擎。例如看quick-cocos2d-x的2048的例子並自己做一個。

題主加油啊!


不知道題主為什麼要用OpenGL。做2D一個畫點函數就夠了,如果能操作顯示矩陣就更好了,我覺得EGE(Easy Graphic Engine)就很不錯,我就用它做了一個2D引擎,推薦一下stophin/Engine_EGE


別聽吹牛的,Qt帶你飛。


可以去參考下QT5的源代碼和示例。


直接用 NanoVG 封裝吧,這輪子造起來太費時而且可能還沒人家實現得好=。=


推薦閱讀:

如果做一個GIS渲染引擎,圖形API應當選擇OpenGL還是DirectX?
有哪些優秀的 C++ OpenGL 開源遊戲引擎?
為什麼 NVIDIA 的示例總是一條龍?

TAG:遊戲開發 | OpenGL | 遊戲編程 |