OPENGL中文教程 OPENGL-6-框架結(jié)構(gòu)_第1頁
OPENGL中文教程 OPENGL-6-框架結(jié)構(gòu)_第2頁
OPENGL中文教程 OPENGL-6-框架結(jié)構(gòu)_第3頁
OPENGL中文教程 OPENGL-6-框架結(jié)構(gòu)_第4頁
OPENGL中文教程 OPENGL-6-框架結(jié)構(gòu)_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、.5、創(chuàng)建一個空白的OpenGL程序框架NeHe SDK是把Nehe的教程中所介紹的所有功能,以面向?qū)ο蟮男问剑峁┙o編程人員快速開發(fā)的一套編程接口。在下面的教程中,我將按NeHe SDK源碼的功能分類,一步一步把這套api介紹給大家。如果你覺得有更好的學(xué)習(xí)方法,或者有其他有益的建議,請聯(lián)系我。zhouwei02,zhouwei506我在第四課的基礎(chǔ)上,把公共的功能提取出來,并刪除了特定的繪制函數(shù),就完成了這個空白的程序框架,它可以使用基本的OpenGL繪制命令,并提供視口,文本,紋理類的接口,實用他們可以快速創(chuàng)建你想要的效果。這個框架分為兩個部分,啟用main.cpp文件完成創(chuàng)建窗口,提供必

2、需的全局變量和執(zhí)行程序循環(huán)等固定的功能。在以后的演示程序中一般不在改變。draw.cpp文件完成具體的繪制操作,它隨你的應(yīng)用而變化。main.cpp的所有功能在前面的課程中都詳細(xì)講解過,這里只是把整個程序結(jié)構(gòu)在說明一下,讓你有一個清晰的認(rèn)識。下面是它的七大結(jié)構(gòu)1. 頭文件和全局變量 2. Windows主函數(shù) 3. 根據(jù)用戶設(shè)置配置OpenGL的窗口 4. 創(chuàng)建OpenGL運行的窗口,并返回窗口的句柄 5. 設(shè)置繪制字體的參數(shù) 6. 程序循環(huán) 7. 退出程序 我們一一介紹如下:1、頭文件和全局變量#include "opengl.h"/ 包含創(chuàng)建OpenGL程序的框架類#i

3、nclude "splash.h"/ 創(chuàng)建配置對話框#include "view.h"/ 包含視口類的聲明#include "text.h"/ 包含2D文字類的聲明#include "texture.h"/ 包含紋理類的聲明#pragma comment( lib, "NeheSDK.lib" )/ 包含NeheSDK.lib庫using namespace NeHe;/ 使用NeHe名字空間Viewview;/ 創(chuàng)建視口類Text2Dtext2D;/ 2D文字類Texturetex;/ 使用全

4、局變量Texture類的實例inttexID;/ 使用全局變量texID,保存加載的紋理ID2、Windows主函數(shù)int WINAPI WinMain(HINSTANCE hInstance, / 程序?qū)嵗浔?HINSTANCE hPrevInstance, / 前一個程序?qū)嵗浔?LPSTR lpCmdLine, / 命令行參數(shù) int nCmdShow) / Window 顯示狀態(tài)OpenGL WinOpenGL;/ OpenGL類3、根據(jù)用戶設(shè)置配置OpenGL的窗口/*根據(jù)用戶設(shè)置配置OpenGL的窗口*/ 顯示配置對話框 SplashResolutionres;/ 記錄分辨率Sp

5、lashDepthdepth;/ 記錄顏色深度boolfs;/ 是否全屏 if(!DoSplash("setup.cfg",&res,&depth,&fs)return 1;int width,height;/ 窗口的大小int bpp;/ 顏色位深/ 設(shè)置分辨率switch(res)case sr640x480:width=640;height=480; break;case sr800x600:width=800;height=600; break;case sr1024x768:width=1024; height=768; break;def

6、ault:width=800; height=600;/ 設(shè)置顏色位深switch(depth)case sd8bit:bpp=8;break;case sd16bit:bpp=16;break;case sd32bit:bpp=32;break;default:bpp=32;/ 設(shè)置是否全屏WinOpenGL.SetFullScreen(fs=true) ? true : false); /*根據(jù)用戶設(shè)置配置OpenGL的窗口:結(jié)束*/4、創(chuàng)建OpenGL運行的窗口,并返回窗口的句柄/*創(chuàng)建OpenGL運行的窗口,并返回窗口的句柄*/ 創(chuàng)建我們的OpenGL窗口if (!WinOpenGL.

7、CreateGLWindow("DancingWind's OpenGL Framework", width, height, bpp, WinOpenGL.GetFullScreen()return 0; / 失敗,則退出/ 返回窗口類Window *win=WinOpenGL.GetWindow();/*創(chuàng)建OpenGL運行的窗口,并返回窗口的句柄:結(jié)束*/5、設(shè)置繪制字體的參數(shù)/*設(shè)置繪制字體的參數(shù)*/TextType ttype;/ 設(shè)置字體結(jié)構(gòu)="Courier New"/ 字體名稱為"Courier Ne

8、w"ttype.size=24;/ 字體大小為24ttype.bold=false;/ 不使用粗體ttype.italic=false;/ 不使用斜體ttype.underline=false;/ 不使用下劃線text2D.Setup(&WinOpenGL,ttype);/ 設(shè)置字體/*設(shè)置繪制字體的參數(shù):結(jié)束*/6、程序循環(huán)/*程序循環(huán)*/bool finish=false;/ 執(zhí)行程序循環(huán)while(!finish)/ 繪制場景finish=!WinOpenGL.DrawGLScene();/ 按ESC退出if(!finish)finish=win->GetKey(

9、VK_ESCAPE);/*程序循環(huán):結(jié)束*/7、退出程序/*退出程序*/ / 關(guān)閉 WinOpenGL.KillGLWindow(); return 0; / 退出程序/*退出程序:結(jié)束*/到這里框架結(jié)構(gòu)就完成了,下面我們進(jìn)入到draw.cpp文件中。這個文件主要完成你特定功能的繪制操作,為了以后的演示方便,我們定義了一些默認(rèn)函數(shù),當(dāng)你熟悉了以后,完全可以使用自己的函數(shù)替代這些功能簡單的“玩具函數(shù):)”。它主要提供了繪制函數(shù)的接口,完成以下四個功能:1. 頭文件和全局變量 2. 繪制三棱錐 3. 初始化場景 4. 設(shè)置默認(rèn)的視口棱臺體 5. 繪制場景 我們一一介紹如下:1、頭文件和全局變量#i

10、nclude "opengl.h"/ 包含創(chuàng)建OpenGL程序的框架類#include "view.h"/ 包含視口類的聲明#include "text.h"/ 包含2D文字類的聲明#include "texture.h"/ 包含紋理類的聲明#pragma comment( lib, "NeheSDK.lib" )/ 包含NeheSDK.lib庫using namespace NeHe;/ 使用NeHe名字空間extern Viewview;/ 使用全局變量View類的實例extern Text

11、2Dtext2D;/ 使用全局變量Text2D類實例extern Texturetex;/ 使用全局變量Texture類的實例extern inttexID;/ 使用全局變量texID,保存加載的紋理IDstatic bool initialize = true;/ 記錄是否初始化在上面的聲明中,extern說明使用外部的全局變量,這里指的是實用main.cpp文件中聲明的全局變量。initialize變量用來記錄是否在繪制過程中調(diào)用初始化函數(shù),如果為true,則需要調(diào)用初始化函數(shù)一次。2、繪制三棱錐函數(shù)為了說明方便,我們定義兩個繪制三棱錐的函數(shù),DrawTri是實用固定顏色繪制三棱錐,Dra

12、wTexTri是使用紋理坐標(biāo)繪制三棱錐。三棱錐在模型空間中的范圍是:X方向:-1到1Y方向:-1到1Z方向:0到1記得讓這個范圍位于你的視口棱臺體內(nèi),否則你將什么也看不到。下面我們來看看具體的代碼: /*繪制三棱錐*/ 繪制三棱錐void DrawTri(void)glPushAttrib(GL_CURRENT_BIT);/ 保存當(dāng)前的繪制屬性glBegin(GL_TRIANGLES);/ 前面glColor3f(1.0f,0.0f,0.0f);glVertex3f( 0.0f, 1.0f, 0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1

13、.0f, 1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f( 1.0f,-1.0f, 1.0f);/ 右面glColor3f(1.0f,0.0f,0.0f);glVertex3f( 0.0f, 1.0f, 0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f( 1.0f,-1.0f, 1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.0f,-1.0f, -1.0f);/ 后面glColor3f(1.0f,0.0f,0.0f);glVertex3f( 0.0f, 1.0f, 0.0f);

14、glColor3f(0.0f,1.0f,0.0f);glVertex3f( 1.0f,-1.0f, -1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f, -1.0f);/ 左面glColor3f(1.0f,0.0f,0.0f);glVertex3f( 0.0f, 1.0f, 0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f, 1.0f);glEnd();glPopA

15、ttrib();/ 彈出保存的繪制屬性/ 繪制帶紋理坐標(biāo)的三棱錐void DrawTexTri(void)glPushAttrib(GL_CURRENT_BIT);/ 保存當(dāng)前的繪制屬性glBegin(GL_TRIANGLES);/ 前面glTexCoord2f(0.5f,0.5f);glVertex3f( 0.0f, 1.0f, 0.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f, 1.0f);glTexCoord2f(1.0f,0.0f);glVertex3f( 1.0f,-1.0f, 1.0f);/ 右面glTexCoord2f(0.

16、5f,0.5f);glVertex3f( 0.0f, 1.0f, 0.0f);glTexCoord2f(1.0f,0.0f);glVertex3f( 1.0f,-1.0f, 1.0f);glTexCoord2f(1.0f,1.0f);glVertex3f( 1.0f,-1.0f, -1.0f);/ 后面glTexCoord2f(0.5f,0.5f);glVertex3f( 0.0f, 1.0f, 0.0f);glTexCoord2f(1.0f,1.0f);glVertex3f( 1.0f,-1.0f, -1.0f);glTexCoord2f(0.0f,1.0f);glVertex3f(-1.0

17、f,-1.0f, -1.0f);/ 左面glTexCoord2f(0.5f,0.5f);glVertex3f( 0.0f, 1.0f, 0.0f);glTexCoord2f(1.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glTexCoord2f(0.0f,0.0f);glVertex3f(-1.0f,-1.0f, 1.0f);glEnd();glPopAttrib();/ 彈出保存的繪制屬性/*繪制三棱錐:結(jié)束*/3、初始化場景我們創(chuàng)建一個空的初始化函數(shù),在你的應(yīng)用中可以把那些在繪制開始時需要做的工作添加到這里面來。/*初始化場景*/void IniScen

18、e(OpenGL* gl, ControlData* cont)/*初始化場景:結(jié)束*/4、設(shè)置默認(rèn)的視口棱臺體一般在繪制場景的開始,都要把模型變換矩陣和投影變換矩陣設(shè)置為單位矩陣。為了簡化這個工程我們創(chuàng)建了這個函數(shù)。它創(chuàng)建的視口棱臺體的范圍如下:· 默認(rèn)的視口棱臺體的范圍是,視角45度,近切面距離視點0.1,遠(yuǎn)切面距離視點100。 · 默認(rèn)在z=0的平面上的可見范圍是,Y軸方向(-2,+2),X軸方向(-2,+2)*寬高比 · 視點位于(0,0,5),朝向-Z軸,上方向量為Y軸 · 寬高比由窗口大小決定,如果窗口大小為800x600,則寬高比為4/3,

19、X軸的可見范圍是(-2.67,+2.67) /*設(shè)置默認(rèn)視口棱臺體*/void SetDefaultView()/ 默認(rèn)的視口棱臺體的范圍是,視角45度,近切面距離視點0.1,遠(yuǎn)切面距離視點100。/ 默認(rèn)在z=0的平面上的可見范圍是,Y軸方向(-2,+2),X軸方向(-2,+2)*寬高比/ 寬高比由窗口大小決定,如果窗口大小為800x600,則寬高比為4/3,X軸的可見范圍是(-2.67,+2.67)view.Reset();/ 重置視口view.LookAt(Vector(0,0,5),Vector(0,0,0),Vector(0,1,0);/ 設(shè)定視口在(0,0,5),朝向-Z軸,上方向

20、量為Y軸/*設(shè)置默認(rèn)視口棱臺體:結(jié)束*/5、繪制場景在創(chuàng)建第一個場景時,需要調(diào)用初始化場景的操作,每繪制一次場景都要把視口重新設(shè)定一下。故把這個功能加入到了繪制場景函數(shù)的開始部分,代碼如下:/*繪制場景*/void DrawScene(OpenGL *gl,ControlData *cont)/ 初始化if(initialize)IniScene(gl,cont);initialize = false;SetDefaultView();/ 設(shè)置默認(rèn)的視口/*繪制場景:結(jié)束*/好了上面就是整個程序框架了,下面我們簡單的回顧一下如何快速實用各個類提供的功能,主要包括以下三個功能:1. 設(shè)置視口 2

21、. 繪制文本 3. 設(shè)置紋理 1、設(shè)置視口 在程序中重新設(shè)置視口只需要下面兩個步驟,重置視口,設(shè)置視點的位置和方向,不要忘了我們的視口棱臺體的范圍是:· 默認(rèn)的視口棱臺體的范圍是,視角45度,近切面距離視點0.1,遠(yuǎn)切面距離視點100。 · 默認(rèn)在z=0的平面上的可見范圍是,Y軸方向(-2,+2),X軸方向(-2,+2)*寬高比 下面是一個示例代碼view.Reset();/ 重置視口view.LookAt(Vector(0,0,5),Vector(0,0,0),Vector(0,1,0);/ 設(shè)定視口在(0,0,5),朝向-Z軸,上方向量為Y軸2、繪制文本下面的代碼告訴你如何在窗口的頂層繪制文本,默認(rèn)文本在三維空間中位于z=0的平面,當(dāng)然你可以使用Translate函數(shù)來改變它在空間中的位置。2D文本一直面對視點,Rotate函數(shù)對它不起作用。view.Save();/ 保存當(dāng)前的視口矩陣view.Reset();/ 重置視口矩陣view.Translate(0.0f,0.0f,-5.0f);/ 把繪制的模型坐

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論