李蕊 周民
摘要:近年過,隨著圖形硬件及圖形接口的更新?lián)Q代,用于游戲的實時圖形引擎得到了突飛猛進的發(fā)展,各種開源引擎與商業(yè)引擎層出不窮。該文旨在運用計算機圖形學理論知識,基于OpenGL 3.3的標準以及GLSL著色語言,使用C++語言編寫和Visual Studio 2010平臺,完成一個擁有模型載入、貼圖載入、UI界面、地形系統(tǒng)以及人機交互系統(tǒng)的圖形引擎,能夠用于游戲場景與漫游類的應用。
關(guān)鍵詞:引擎;OpenGL; GLSL
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2014)25-5960-03
Design and Implementation of Graphics Engine Based on OpenGL
LI Rui, ZHOU Ming
(Nanyang Institute of Technology,Nanyang 473000,China)
Abstract: In recent years, along with the graphics hardware upgrade, the development of graphical interfaces. Real-time graphics engine for the game has been rapid development. There have been many game engines.This paper aims to use the computer graphics theory, based on the version of the standard OpenGL 3.3, GLSL shading language, using the C++ language, Visual Studio 2010 platform, complete this graphics engine, with Model loading, Texture loading, User Interface, Terrain, as well as Interactive. It can be used for simple games, scene roaming applications and so on.
Key words: Graphics; engine; OpenGL; GLSL
從PONG開始游戲逐漸融入我們的生活?,F(xiàn)在的世界,游戲已經(jīng)無處不在,隨著游戲畫面的日漸逼真,游戲開發(fā)用到的技術(shù)日新月異,越來越多的人加入到游戲開發(fā)的行列中。圖形引擎是游戲引擎中最重要的部分,游戲重要的技術(shù)突破也都是通過圖形這個部分達到的。從最初的2D簡單畫面,到實時3D技術(shù)的應用,再到現(xiàn)在足以媲美CG的畫質(zhì),圖形學的技術(shù)可謂日新月異[1]。圖形引擎用到的只是屬于計算機圖形學中的實時圖形學部分,圖形引擎是游戲引擎一個重要的部分,占據(jù)了游戲開發(fā)70%以上的比重,一個優(yōu)秀的引擎能大大減少游戲開發(fā)的工作量。
該文研究了一個圖形引擎的實現(xiàn)過程,以及這個圖形引擎用到的技術(shù),系統(tǒng)以計算機圖形學概念作為基礎,采用OpenGL3.3圖形接口作為引擎的底層,使用OpenGL的glew庫,glew能支持所有的OpenGL版本,并且能夠使用GLSL著色語言。
1 設計游戲引擎的理論基礎
OpenGL(Open Graphics Library)是一種與硬件、窗口系統(tǒng)和OS相獨立的一系列API。它的前身是由SGI公司為其圖形工作站開發(fā)的IRIS GL,是一個工業(yè)標準3D計算機軟件接口。后來,為了實現(xiàn)向其它平臺移植,開發(fā)了OpenGL?,F(xiàn)在OpenGL由Khronos工作組負責OpenGL標準的指定。OpenGL不僅有Graphics Library的功能,而且是開放的,可用于多種硬件及操作系統(tǒng)[2]。
OpenGL本身并不是一個庫或者是一個SDK,它并沒有SDK,它是一個連接圖形硬件的接口,我們使用Khronos或顯卡廠商提供的核心函數(shù)或者擴展可以方便的控制顯卡的工作,OpenGL幫助我們控制顯卡,使得顯卡可以按照我們的意愿顯示圖形[2]。OpenGL是一個狀態(tài)機,以及客戶/服務器(C/S)結(jié)構(gòu),不過這里的服務器指的是顯卡,而服務存儲器指的是顯存,如圖1所示。
2 需求分析
2.1模型對象的載入
圖形引擎一個核心的部分就是將自己的模型在引擎中實時的顯示出來。雖然模型對象都是點、面等圖元信息,但是一般人絕對不會自己去一個一個點坐標寫,而是使用常規(guī)的建模軟件,制作模型,然后導出成需要的格式文件[3]。這些文件中存儲著需要用到的數(shù)據(jù)。模型的載入就是從這些文件中讀取數(shù)據(jù),然后重新整合數(shù)據(jù)之后,顯示在屏幕上,而模型的格式也不是一種,每種格式的數(shù)據(jù)存儲方式又不同。模型分為靜態(tài)模型,逐幀模型和骨骼模型。所以本引擎靜態(tài)模型采用了應用最為廣泛的obj模型格式。這個格式每一個建模軟件都是可以導出的。
2.2材質(zhì)的設置
材質(zhì)作為模型對象表面屬性的體現(xiàn),同樣是極其重要的。材質(zhì)其中重要的屬性是顏色與貼圖,本引擎支持從obj格式文件中獲取mlt格式的材質(zhì),并且如果材質(zhì)存在會自動賦予材質(zhì),當然可以手動賦予材質(zhì)。
2.3著色器設置
引擎中自建有默認著色器,在沒有著色器設置的情況下,會自動調(diào)用默認的著色器。如果有用戶創(chuàng)建的著色器,就會判斷用戶創(chuàng)建的著色器是否可用,如果可用就調(diào)用用戶創(chuàng)建的著色器來渲染場景。
2.4界面系統(tǒng)
既然是實時的交互系統(tǒng),用戶會需要一定的交互功能,比如顯示文字,按鈕等控件。傳統(tǒng)的winAPI雖然好用,但是并不是跨平臺。系統(tǒng)需要提供一套適用的界面UI提供給用戶使用。
2.5地形系統(tǒng)
引擎中支持使用黑白高度圖生成地形,地形會自動設置每個頂點的法線,確保渲染效果正常。同時地形可以大量的拼接在一起,設置得當?shù)牡匦慰梢詫崿F(xiàn)無限地形的效果,地形也支持材質(zhì)的賦予。
3 引擎系統(tǒng)的設計與實現(xiàn)
3.1引擎系統(tǒng)框架圖
支撐引擎的是OpenGL與控制系統(tǒng),OpenGL下又有分為著色程序(Shader)與緩沖對象??刂葡到y(tǒng)主要用來控制模型、材質(zhì)、界面以及地形[4]。本引擎系統(tǒng)的框架圖如圖2所示:
控制系統(tǒng)用于控制OpenGL令其實現(xiàn)想要實現(xiàn)的功能。模型與材質(zhì)甚至UI最后都會交給緩沖對象,由緩沖對象交給Shader之后再GPU中最后生成出想要的圖像。
3.2功能模塊設計
本引擎系統(tǒng)雖然是極限編程的思想,但是也沒有拋棄模塊化的設計。本引擎的模塊分為6個、核心模塊、著色程序模塊、模型對象模塊、材質(zhì)模塊、UI模塊以及地形模塊[5],如圖3所示:
3.3窗口生成
引擎系統(tǒng)在執(zhí)行的時候需要窗口的承載,OpenGL是不允許直接調(diào)用Windows的窗口系統(tǒng),所以需要創(chuàng)建一個窗口。在Windows下創(chuàng)建窗口并獲取窗口句柄,然后將OpenGL綁定在這個創(chuàng)建好的窗口上。本引擎只使用一個窗口,窗口被封裝在一個類當中,可以隨著需求修改窗口屬性。同時實現(xiàn)了窗口在改變大小時,會橫向按照比例縮放,比例的數(shù)值就是屏幕分辨率的數(shù)值
3.4著色器生成
窗口創(chuàng)建好之后初始化OpenGL,因為OpenGL初始化比較簡單,不再貼出詳細代碼,隨后生成內(nèi)建著色程序,內(nèi)建著色程序需要調(diào)用到OpenGL的句柄,而系統(tǒng)原則上不允許核心意外的模塊調(diào)用OpenGL的任何函數(shù),所以將會建立使用函數(shù)的借口,以方便與其他模塊的連接。內(nèi)建著色程序只有頂點著色程與片段著色,使用Phong光照模型,僅支持一個頂點緩沖器,每個模型僅支持一張貼圖。
3.5模型讀取
模型讀取需要IO操作,通過IO流得到文件,并對文件進行分析,obj格式與MD5格式都是文本格式的模型文件,這里以obj格式模型為例
4 應用舉例
引擎系統(tǒng)在執(zhí)行的時候需要窗口的承載,OpenGL是不允許直接調(diào)用Windows的窗口系統(tǒng),所以需要創(chuàng)建一個窗口。在Windows下創(chuàng)建窗口并獲取窗口句柄,然后將OpenGL綁定在這個創(chuàng)建好的窗口上。窗口創(chuàng)建好之后初始化OpenGL,因為OpenGL初始化比較簡單,不再貼出詳細代碼,隨后生成內(nèi)建著色程序,內(nèi)建著色程序需要調(diào)用到OpenGL的句柄。模型讀取需要IO操作,通過IO流得到文件,并對文件進行分析。當模型讀取完成之后,我們就可以嘗試讀取一個模型,如圖4所示,這是一個擁有40萬個面的模型,一共向我們展示了四架飛機,左上角是通過Fraps測試的刷新率??梢钥闯龌赩BO與VAO的模型讀取之后使用時效率十分高。
6 小結(jié)
本文的主要內(nèi)容是引擎系統(tǒng)的編碼與實現(xiàn)過程。這里主要描述了核心模塊窗口在Windows下依賴Windows窗口句柄創(chuàng)建窗口并綁定與OpenGL,引擎內(nèi)置著色器生成,以及緩沖對象的建立。著色程序模塊會給用戶創(chuàng)建著色程序提供便利,非常方便的加載以及非??旖莸膮?shù)傳遞。模型對象模塊可以方便的讀取模型,并且傳遞給核心,讓核心生成相應的VBO緩沖器。界面模塊依賴于panel這個基類,所有的控件類都會繼承這個基類,最后跟鼠標鍵盤事件結(jié)合,構(gòu)成良好的界面模塊。粒子模塊會根據(jù)需要高效的生成與顯示粒子,并且賦予相應貼圖表現(xiàn)出特定的效果。地形模塊通過給出的高度圖生成地形模型,并且可以選擇性的繪制地形的質(zhì)量。引擎中還存在一些智能算法問題,有待進一步研究。
參考文獻:
[1] Khronos Group.OpenGL wiki百科[EB/OL].http://zh.wikipedia.org/wiki/OpenGL,2012.
[2] 劉志強.基于OpenGL的三維游戲引擎的研究[D]. 天津:河北工業(yè)大學,2008:11-21.
[3] Donald Hearn,M.Pauline Baker.計算機圖形學[M].3版.北京:電子工業(yè)出版社,2010.
[4] 林巧民,林萍,王汝傳.基于OGRE的智能游戲引擎的設計與實現(xiàn)[J].南京郵電大學學報:自然科學版,2010(30):71-76.
[5] Richard S.Wright,Jr.,Nicholas Haemel.OpenGL超級寶典[M].5版.北京:人民郵電出版社,2012.