最近在重學OpenGL,之因此說重學是由於上次接觸OpenGL仍是在學校裏,工做以後就一直在搞D3D,一轉眼已經畢業6年了.OpenGL這門手藝早就徹底荒廢了,如今只能是重學.學習程序最有效的辦法是動手寫,光看書是不行了,由於看書的時候很容易陷入對人類兩大難題的思考中,以致於進展緩慢.這兩大難題是:這特媽是啥?那特媽又是啥?在重學的過程當中,我翻寫了Nehe全部的OpenGL教程DEMO.原本打算把"翻寫"寫成"重構"的,但想一想"重構"這個詞這麼高端大氣上檔次,一般只有牛B的人和裝B的人愛提,我要是用"重構",感受後者的嫌疑更大.windows
先貼出個人OpenGL做品:框架
軟件說明:函數
"WhyGL演示程序平臺.exe"和"WhyGL.exe"均可以運行程序,不一樣之處在於,一個是基本的Windows窗體程序,一個是MFC的單文檔界面程序.學習
主UI界面上,鼠標點擊能夠選擇要運行的DEMO
鍵盤的上下鍵也能夠選擇DEMO,PageUp和PageDown用於翻頁,回車鍵用於啓動選中的DEMO字體
F11鍵用於全屏切換,
ESC用於退出當前DEMO及退出全屏
每一個DEMO都會將提示文字信息顯示在界面上,H鍵能夠隱藏文字.spa
軟件下載地址:
http://files.cnblogs.com/WhyEngine/WhyGL.7z調試
全部的DEMO都寫在同一個程序中,採用面向對象的方法,每個DEMO都對應一個對象.Nehe的DEMO中基本上是採用全局變量,全局函數來實現,而我翻寫的程序儘可能將其封裝爲對象的成員變量和成員函數.之因此稱這套系統爲一個框架,是由於我提供了一套學習OpenGL的平臺,能夠幫助3D程序的初學者更容易入門,用戶能夠方便的在上面添加本身的程序.code
3D程序一開始接觸會以爲很難,不過究其根本能夠分爲如下幾個過程:對象
(1)初始化渲染設備;
(2)建立渲染數據,設置渲染狀態;
(3)執行數據的處理操做;
(4)響應消息事件;
(5)渲染處理;
(6)刪除渲染數據,恢復渲染狀態;
(7)銷燬渲染設備.blog
在WhyGL框架中,我儘可能將一些系列通用的複雜的流程封裝好,以便於用戶寫代碼時,只關心具體的渲染邏輯.這有些相似GLUT,在GLUT中將windows窗體的建立,事件處理都封裝好,用戶只填寫回調函數便可實現.在WhyGL,爲用戶提供一個DEMO基類,用戶須要繼承該類,並添加本身的成員變量,重載其方法就能夠繪製本身的圖形.這就如同考試時將問答題改爲填空題,下降了難度.
先提供個具體的DEMO類如何寫:
FlyingHelper.h
View Code
FlyingHelper.cpp
View Code
代碼中"// ......."的部分是由用戶改寫的.
源碼下載地址:
http://pan.baidu.com/s/1bniWD0z
源碼中有4個模塊,
"SampleWin"和"WhyDemoViewer"爲Windows應用程序.
"WhyGLDevice"爲OpenGL的設備建立模塊,裏面還實現了字體的顯示功能和簡單二維圖形顯示的功能.
"WhyTestGL"爲具體的DEMO邏輯,用戶能夠在這裏添加本身的代碼.
程序中還須要一個模塊WhyCore這是我引擎的核心,用於對其餘模塊的加載管理,不過我尚沒有將其開源的打算.
接下來要說下程序須要的兩個配置文件
WhyCore.ini是引擎的啓動文件
ModulesPath = .\dll\ DumpProcess = trueCreateDumpFile = trueWriteDumpLog = trueMaxNumStackFrame = 10Game = CWhyTestGL [WhyTestGL] ;DemoGL = CFlying01
[WhyTestGL] DemoGL = CFlying01 這個表示初始時將啓動哪個DEMO,CFlying01爲一個DEMO對象的類名.用該方法在調試程序時比較方便.
前面加分號;表示該行無效.
WhyTestGL.ini是DEMO的配置文件
[WhyTestGL] Nehe = OpenGL-Nehe OpenGL tutorials most of the source data sets to help you from entry to proficient in OpenGL Flying = WhyEngine Demo [Nehe] CNeheLesson01 = Press any key to change background color CNeheLesson02 = My First Polygon, Draw Triangle and Quad ......... CNeheLesson47 = CG Vertex Shader CNeheLesson48 = ArcBall Rotation [Flying] CFlyingHelper = Flying Helper: Tell you how to create a demo CFlying01 = Test YicGLPrimitive2DRender and draw some 2D graph
這裏的]表示DEMO分爲幾組.
而後每一個字段下是DEMO對象的類名以及對應的相關信息.
用戶若是寫了本身的DEMO,請務必在WhyTestGL.INI配置文件中添加上相關信息.