在Nehe的主頁上一共提供了4種不同風(fēng)格的OpenGL程序框架,分別為glut,Win32,面向?qū)ο蟮腤in32,在加上Nehe教程中使用的那一種。
相信沒有幾個(gè)讀者會(huì)耐著性子,把Nehe的第一個(gè)教程看完并編譯成功,因?yàn)槟抢锩嬗兄鴶?shù)不清的數(shù)據(jù)結(jié)構(gòu)和函數(shù),我也是費(fèi)了整整12個(gè)小時(shí)才把它翻譯和排版好。
好了,不浪費(fèi)讀者的時(shí)間了。在這四個(gè)框架中以面向?qū)ο蟮腤in32框架寫的最后,并且功能最全,我們就簡單得介紹一下它的使用,你可以用它學(xué)習(xí)OpenGL的函數(shù),當(dāng)你對(duì)OpenGL的結(jié)構(gòu)有了一定的了解后,不妨看看源代碼,我把一切可能的注釋都寫進(jìn)了源代碼里,希望對(duì)你有幫助。
為了使用這個(gè)框架,你必須熟記以下四個(gè)函數(shù)
我們用它來完成OpenGL的邏輯:
* bool Initialize();* 執(zhí)行所有的初始化工作,如果成功函數(shù)返回true
*
* void Deinitialize();
* 執(zhí)行所有的卸載工作
*
* void Update(DWORD milliseconds);
* 執(zhí)行所有的更新操作,傳入的參數(shù)為兩次操作經(jīng)過的時(shí)間,以毫秒為單位
*
* void Draw();
* 執(zhí)行所有的繪制操作
我們從Initialize()函數(shù)說起
bool GL_Example::Initialize() // 初始化OpenGL
{
/*****************************************************用戶自定義的初始化過程*******************/
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
ResizeDraw(true); // 改變OpenGL窗口大小,直接調(diào)用子類的函數(shù)
/**********************************************************************************************/
return true; // 成功返回
}
在你程序中,必須實(shí)現(xiàn)這個(gè)函數(shù)。當(dāng)然函數(shù)的定義與聲明我已經(jīng)幫你寫好了,你所做的就是把OpenGL的代碼添加到兩排/******/之間。
下面我繼續(xù)添加更新程序的代碼
void GL_Example::Update(DWORD milliseconds) // 程序更新函數(shù)
{
if (m_Keys.IsPressed(VK_ESCAPE) == true) // 按ESC退出
{
TerminateApplication();
}
if (m_Keys.IsPressed(VK_F1) == true) // 按F1切換窗口/全屏模式
{
ToggleFullscreen();
}
/*******************************用戶自定義的更新過程***************************************/
m_Angle += (float)(milliseconds) / 15.0f; // 更新旋轉(zhuǎn)的角度
/******************************************************************************************/
}
在上面的函數(shù)中,我已經(jīng)為你添加了處理ESC和F1按鍵相應(yīng)的代碼,你所要做的就是完成符合你程序邏輯的更新變量的設(shè)置。同樣可以可以在兩排/******/之間完成它們。
接著,我們看看如何實(shí)現(xiàn)OpenGL的繪制
void GL_Example::Draw() // 繪制函數(shù)
{
/*****************************************************用戶自定義的繪制過程*********************/
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -6.0f);
glRotatef(m_Angle, 0.0f, 1.0f, 0.0f);
glRotatef(m_Angle * 0.7f, -1.0f, 0.0f, 0.0f);
for (int rot1 = 0; rot1 < 2; rot1++) // 繪制四個(gè)交錯(cuò)的三角形(作者想的很巧妙。
{
glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
glRotatef(180.0f, 1.0f, 0.0f, 0.0f);
for (int rot2 = 0; rot2 < 2; rot2++)
{
glRotatef(180.0f, 0.0f, 1.0f, 0.0f);
glBegin(GL_TRIANGLES);
glColor3f(1.f, 0.f, 0.f); glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.f, 1.f, 0.f); glVertex3f(-1.0f, -1.0f, 1.0f);
glColor3f(0.f, 0.f, 1.f); glVertex3f( 1.0f, -1.0f, 1.0f);
glEnd();
}
}
/***********************************************************************************************/
glFlush(); // 強(qiáng)制執(zhí)行所有的OpenGL命令
}
我給你的原始文件,其實(shí)什么也沒幫你做,你將會(huì)的到一個(gè)空的窗口。
上面的實(shí)例是一個(gè)簡單的OpenGL繪制,它將繪制四個(gè)三角形。
void GL_Example::Deinitialize() // 用戶自定義的卸載函數(shù)
{
/*****************************************************用戶自定義的卸載過程*********************/
/**********************************************************************************************/
}
當(dāng)你完成了所有的功能,在退出的時(shí)候記得釋放所有的資源啊,這個(gè)接口我也提供給你了,記得不要忘了啊。
好了,上面就是我提供給你的簡單的OpenGL程序框架,簡單吧。使用它可以很快的創(chuàng)建一個(gè)基于OpenGL的應(yīng)用程序,讓你能化更多時(shí)間在OpenGL本身,而不是考慮如何實(shí)現(xiàn)Windows編程,以及處理那些莫名其妙的編譯問題。我已經(jīng)為你設(shè)置好了一切,包括頭文件,lib庫等相關(guān)的東西,你所要做的就是把資源下載中的“OOWin32框架”下載下來,修改其中Example.cpp文件就可以了,如果你需要自己創(chuàng)建工程,請(qǐng)把這個(gè)目錄你所有的*.h,*.cpp,*.lib文件拷貝到你創(chuàng)建的工程中,并把Example文件改名,記得在*.cpp文件中的頭文件也需要做相應(yīng)的更改。
當(dāng)然上面所說的僅僅是一個(gè)開始,希望你學(xué)完OpenGL后,有時(shí)間看看這個(gè)實(shí)現(xiàn)的源代碼。
就這樣吧,OpenGL的大門已經(jīng)向你打開了!
資源簡介:
1.創(chuàng)建一個(gè)OpenGL窗口:在這個(gè)教程里,我將教你在Windows環(huán)境中創(chuàng)建OpenGL程序.它將顯示一個(gè)空的OpenGL窗口,可以在窗口和全屏模式下切換,按ESC退出.它是我們以后應(yīng)用程序的框架.
理解OpenGL如何工作非常重要,你可以在教程的末尾下載源程序,但我強(qiáng)烈建議你至少讀一遍教程,然后再開始編程.
2.你的第一個(gè)多邊形:
在第一個(gè)教程的基礎(chǔ)上,我們添加了一個(gè)三角形和一個(gè)四邊形。也許你認(rèn)為這很簡單,但你已經(jīng)邁出了一大步,要知道任何在OpenGL中繪制的模型都會(huì)被分解為這兩種簡單的圖形。
讀完了這一課,你會(huì)學(xué)到如何在空間放置模型,并且會(huì)知道深度緩存的概念。
3.添加顏色:
作為第二課的擴(kuò)展,我將叫你如何使用顏色。你將理解兩種著色模式,在左圖中,三角形用的是光滑著色,四邊形用的是平面著色。 注意三角形上的顏色是如何混合的。
顏色為OpenGlL 工程增加很多。通過理解平面著色(flat coloring)和平滑著色(smooth coloring),你能顯著的改善你的OpenGL Demo的樣子。
4.旋轉(zhuǎn):
在這一課里,我將教會(huì)你如何旋轉(zhuǎn)三角形和四邊形。左圖中的三角形沿Y軸旋轉(zhuǎn),四邊形沿著X軸旋轉(zhuǎn)。 這一章將引入兩個(gè)變量, rtri 被用來存儲(chǔ)三角形的角度, rquad存儲(chǔ)四邊形的角度。
和容易創(chuàng)建一個(gè)多邊形組成的場景。讓這些物體動(dòng)起來是整個(gè)場景變得生動(dòng)起來。在后面的課程鐘我將教給你如何繞屏幕上的一個(gè)點(diǎn)旋轉(zhuǎn)物體,使得物體繞屏幕而不是它的軸轉(zhuǎn)動(dòng)。
5.3D形體:
既然我們已經(jīng)領(lǐng)會(huì)到多邊形,方形,色彩和旋轉(zhuǎn)。現(xiàn)在該建立3D物體了。我將使用多邊形和矩形c創(chuàng)建3D物體。這次我們將擴(kuò)展上一章的教程,并且將三角形轉(zhuǎn)換成一個(gè)彩色的棱錐,把正方形變?yōu)橐粋(gè)實(shí)心正方體。棱錐使用混合色,正方體每個(gè)面使用一種顏色。在3D空間創(chuàng)建物體可能很費(fèi)時(shí)間,但是所獲得的結(jié)果(收獲)值得這樣做。充分發(fā)揮你的想象力吧。
6.紋理映射:
你想要它,它現(xiàn)在就在這里了,那就是 ... 紋理映射!!!在這一章我將教會(huì)你如何將一幅位圖(bitmap)映射到正方體的六個(gè)面上去。我們將使用第一章的OpenGL代碼來創(chuàng)建工程。創(chuàng)建一個(gè)空的窗口比修改上一課的代碼更容易。
你將會(huì)發(fā)現(xiàn)第一章的代碼在對(duì)于快速創(chuàng)建工程來說是及其有價(jià)值的。第一章的代碼為你設(shè)置好了一切,你所需要做的只是集中精力為效果編程。
7.紋理濾波, 光照和鍵盤控制:
好的,我希望到現(xiàn)在你已經(jīng)理解了所有的東西,因?yàn)檫@是一個(gè)巨大的教程。我想教給你兩個(gè)新的方法來過濾(filter)你的紋理,簡單的光照,鍵盤控制并且還可能更多 :) .如果你對(duì)到這一課為止你所學(xué)的東西并不充滿信心,那就回頭復(fù)習(xí)一下。玩一下其它課程的代碼,不要操之過急。最好專心把每一課學(xué)好,而不是蜻蜓點(diǎn)水,只知道如何把東西做出來。
8.混合
有理由等一下,一個(gè)來自很酷的Hypercosm的程序員伙伴問(我)他是否可以寫一章關(guān)于混合的教程。第八課通常正是講混合的,所以太巧了。這一章教程擴(kuò)展了第七章;旌鲜且豁(xiàng)很酷的技術(shù) .. 我希望你們能好好享受這一章教程。這一章的作者是Tom Stanis他在這制作一章上花費(fèi)了很多精力,所以讓他知道你覺得怎么樣。混合可不是一個(gè)好講的話題。
9.在3D空間中移動(dòng)位圖:
這一章覆蓋了一些你們要求的主題,你想知道如何移動(dòng)你在3D屏幕空間上創(chuàng)造的物體。你想要知道如何在屏幕上繪制一幅位圖,并且位圖的黑色部分不會(huì)覆蓋它后面的東西。你想要簡單的動(dòng)畫,想要更多的混合的應(yīng)用,這一章將教會(huì)你所有這些。You'll notice there's no spinning boxes(yaker:很慚愧這一句我不是很明白)。前面的課程覆蓋了OpenGL的基礎(chǔ),每一章都基于前面的內(nèi)容。前面的課程涵蓋了基礎(chǔ)的OpenGL,每一課都是在前一課的基礎(chǔ)上創(chuàng)建的。這一課是前面幾課知識(shí)的綜合,當(dāng)你學(xué)習(xí)這課時(shí),請(qǐng)確保你已經(jīng)掌握了前面幾課的知識(shí)。
10.加載3D世界,并在其中漫游:
你一直期待的教程來了!這一章友一個(gè)叫Lionel Brites的伙伴制作。這一課里你講學(xué)到如何導(dǎo)入一個(gè)3D世界。代碼仍然使用第一章的,但是,課程頁面只是解釋了新的部分,包括導(dǎo)入3D場景,在3D世界中移動(dòng)。下載VC++代碼并且在你閱讀教程的同時(shí)閱讀代碼。按[B]鍵控制混合,[F]鍵控制濾波,[L]鍵控制光照(但光并不隨場景移動(dòng)),還有[Page UP]和[Page Down]鍵。我希望你能喜歡Lionel對(duì)網(wǎng)站的貢獻(xiàn)。我有空的時(shí)候我會(huì)讓這個(gè)教程更容易學(xué)習(xí)。
11.旗幟效果 (飄動(dòng)的紋理):
這一章教程由Bosco帶給你。他就是那個(gè)創(chuàng)造了很酷的小Demo: worthless的家伙。他喜歡每個(gè)人對(duì)他的Demo的反映,并且決定更進(jìn)一步,在他的Demo的最后解釋他怎么實(shí)現(xiàn)這么酷的效果的。這一章教程構(gòu)建在第六章的代碼之上。閱讀完這一章之后,你將能彎曲,折疊以及操縱你自己的紋理。這絕對(duì)是個(gè)很漂亮的效果,并且比紋理固定的旗幟好得多。如果你喜歡這一章,請(qǐng)發(fā)郵件給bosco讓他知道。
12.顯示列表
想知道如何加速你的OpenGL程序么?每次為放置一個(gè)物體在屏幕上而寫很多代碼讓你厭煩了吧?如果是這樣,這一章就是為你準(zhǔn)備的。學(xué)習(xí)如何用OpenGL來顯示列表。只用一行代碼預(yù)構(gòu)建和顯示物體。使用預(yù)編譯物體加速你的程序。不要再一次又一次寫重復(fù)的代碼。讓顯示列表為你做所有的工作吧!這一章里我們將建造Q-bert金字塔(Q-bert是一款游戲),感謝顯示列表,我們只需要用不多的幾行代碼。
13.位圖字體
這一課我們將創(chuàng)建一些基于2D圖像的字體,它們可以縮放,但不能旋轉(zhuǎn),并且總是面向前方,但作為基本的顯示來說,我想已經(jīng)夠了。
14.圖像字體
在一課我們將教你繪制3D的圖形字體,它們可像一般的3D模型一樣被變換。
15.圖形字體的紋理映射:
這一課,我們將在上一課的基礎(chǔ)上創(chuàng)建帶有紋理的字體,它真的很簡單。
16.看起來很酷的霧
這一課是基于第7課的代碼的,你將學(xué)會(huì)三種不同的霧的計(jì)算方法,以及怎樣設(shè)置霧的顏色和霧的范圍。
17.2D 圖像文字
在這一課中,你將學(xué)會(huì)如何使用四邊形紋理貼圖把文字顯示在屏幕上。你將學(xué)會(huì)如何把256個(gè)不同的文字從一個(gè)256x256的紋理圖像中分別提取出來,并為每一個(gè)文字創(chuàng)建一個(gè)顯示列表,接著創(chuàng)建一個(gè)輸出函數(shù)來創(chuàng)建任意你希望的文字。
18.二次幾何體
利用二次幾何體,你可以很容易的創(chuàng)建球,圓盤,圓柱和圓錐。
19.粒子系統(tǒng)
你是否希望創(chuàng)建爆炸,噴泉,流星之類的效果。這一課將告訴你如何創(chuàng)建一個(gè)簡單的例子系統(tǒng),并用它來創(chuàng)建一種噴射的效果。
20.蒙板
到目前為止你已經(jīng)學(xué)會(huì)如何使用alpha混合,把一個(gè)透明物體渲染到屏幕上了,但有的使用它看起來并不是那么的復(fù)合你的心意。使用蒙板技術(shù),將會(huì)按照你蒙板的位置精確的繪制。
21.線,反走樣,計(jì)時(shí),正投影和簡單的聲音
這是我第一個(gè)大的教程,它將包括線,反走樣,計(jì)時(shí),正投影和簡單的聲音。希望這一課中的東西能讓每個(gè)人感到高興。
22.凹凸映射,多重紋理擴(kuò)展
這是一課高級(jí)教程,請(qǐng)確信你對(duì)基本知識(shí)已經(jīng)非常了解了。這一課是基于第六課的代碼的,它將建立一個(gè)非常酷的立體紋理效果。
23.球面映射
這一個(gè)將教會(huì)你如何把環(huán)境紋理包裹在你的3D模型上,讓它看起來象反射了周圍的場景一樣。
24.符號(hào),擴(kuò)展,剪裁和TGA圖像文件的加載
在這一課里,你將學(xué)會(huì)如何讀取你顯卡支持的OpenGL的擴(kuò)展,并在你指定的剪裁區(qū)域把它顯示出來。
25.變形和從文件中加載3D物體
在這一課中,你將學(xué)會(huì)如何從文件加載3D模型,并且平滑的從一個(gè)模型變換為另一個(gè)模型。
26.剪裁平面,蒙板緩存和反射
在這一課中你將學(xué)會(huì)如何創(chuàng)建鏡面顯示效果,它使用剪裁平面,蒙板緩存等OpenGL中一些高級(jí)的技巧。
27.陰影
這是一個(gè)高級(jí)的主題,請(qǐng)確信你已經(jīng)熟練的掌握了基本的OpenGL,并熟悉蒙板緩存。當(dāng)然它會(huì)給你留下深刻的印象的。
28.貝塞爾曲面
這是一課關(guān)于數(shù)學(xué)運(yùn)算的,沒有別的內(nèi)容了。來,有信心就看看它吧。
29.Blitter 函數(shù)
類似于DirectDraw的blit函數(shù),過時(shí)的技術(shù),我們有實(shí)現(xiàn)了它。它非常的簡單,就是把一塊紋理貼到另一塊紋理上。
30.碰撞檢測
這是一課激動(dòng)的教程,你也許等待它多時(shí)了。你將學(xué)會(huì)碰撞剪裁,物理模擬太多的東西,慢慢期待吧。
31.模型加載
你知道大名鼎鼎的Milkshape3D建模軟件么,我們將加載它的模型,當(dāng)然你可以加載任何你認(rèn)為不錯(cuò)的模型。
32.拾取, Alpha混合, Alpha測試, 排序
這又是一個(gè)小游戲,交給的東西會(huì)很多,慢慢體會(huì)吧
33.加載壓縮和未壓縮的TGA文件
在這一課里,你將學(xué)會(huì)如何加載壓縮和為壓縮的TGA文件,由于它使用RLE壓縮,所以非常的簡單,你能很快地熟悉它的。
34.從高度圖生成的美麗地形
這一課將教會(huì)你如何從一個(gè)2D的灰度圖創(chuàng)建地形
35.在OpenGL中播放AVI視頻
在OpenGL中如何播放AVI呢?利用Windows的API把每一幀作為紋理綁定到OpenGL中,雖然很慢,但它的效果不錯(cuò)。你可以試試。
36.放射模糊和渲染到紋理
如何實(shí)現(xiàn)放射狀的濾鏡效果呢,看上去很難,其實(shí)很簡單。把渲染得圖像作為紋理提取出來,在利用OpenGL本身自帶的紋理過濾,就能實(shí)現(xiàn)這種效果,不信,你試試。
37.卡通映射
什么是卡通了,一個(gè)輪廓加上少量的幾種顏色。使用一維紋理映射,你也可以實(shí)現(xiàn)這種效果。
38.從資源文件中載入圖像
如何把圖像數(shù)據(jù)保存到*.exe程序中,使用Windows的資源文件吧,它既簡單又實(shí)用。
39.物理模擬簡介
還記得高中的物理吧,直線運(yùn)動(dòng),自由落體運(yùn)動(dòng),彈簧。在這一課里,我們將創(chuàng)造這一切。
40.繩子的模擬
怎樣模擬一根繩子呢,把它想象成一個(gè)個(gè)緊密排列的點(diǎn),怎么樣有了思路了吧,在這一課你你將學(xué)會(huì)怎樣建模,簡單吧,你能模擬更多。
41.體積霧
把霧坐標(biāo)綁定到頂點(diǎn),你可以在霧中漫游,體驗(yàn)一下吧。
42.多重視口
畫中畫效果,很酷吧。使用視口它變得很簡單,但渲染四次可會(huì)大大降低你的顯示速度哦:)
43.在OpenGL中使用FreeType庫
使用FreeType庫可以創(chuàng)建非常好看的反走樣的字體,記住暴雪公司就是使用這個(gè)庫的,就是那個(gè)做魔獸世界的。嘗試一下吧,我只告訴你了基本的使用方式,你可以走的更遠(yuǎn)。
44.3D 光暈
當(dāng)鏡頭對(duì)準(zhǔn)太陽的時(shí)候就會(huì)出現(xiàn)這種效果,模擬它非常的簡單,一點(diǎn)數(shù)學(xué)和紋理貼圖就夠了。好好看看吧。
45.頂點(diǎn)緩存
你想更快地繪制么?直接操作顯卡吧,這可是前沿的圖形技術(shù),不要猶豫,我?guī)闳腴T。接下來,你自己向前走吧。
46.全屏反走樣
當(dāng)今顯卡的強(qiáng)大功能,你幾乎什么都不用做,只需要在創(chuàng)建窗口的時(shí)候該一個(gè)數(shù)據(jù)?纯窗桑(qū)動(dòng)程序?yàn)槟阕鐾炅艘磺小?br />47.CG 頂點(diǎn)腳本
nVidio的面向GPU的C語言,如果你相信它就好好學(xué)學(xué)吧,同樣這里也只是個(gè)入門。記住,類似的語言還有微軟的HLSL,OpenGL的GLSL,ATI的shaderMonker。不要選錯(cuò)哦:)
48.軌跡球?qū)崿F(xiàn)的鼠標(biāo)旋轉(zhuǎn)
使用鼠標(biāo)旋轉(zhuǎn)物體,很簡單也有很多實(shí)現(xiàn)方法,這里我們教會(huì)你模擬軌跡球來實(shí)現(xiàn)它.