版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
實(shí)驗(yàn)之-OpenGL簡介1OpenGL簡介根本函數(shù)庫與硬件平臺無關(guān)含GL、GLU和GLAUX庫函數(shù)包括:描述圖形元素〔圖元〕、屬性、幾何變換、觀察變換及其它操作實(shí)用函數(shù)工具包〔GLUT:OpenGLUtilityToolkit〕平臺無關(guān)窗口系統(tǒng)操作功能:創(chuàng)立窗口、鼠標(biāo)和鍵盤輸入、菜單及事件驅(qū)動(dòng)21OpenGL體系32一個(gè)簡單的程序#include<>voidmydisplay(){glClearColor(1.0,1.0,0,0);//,設(shè)置背景色,默認(rèn)為黑色 glClear(GL_COLOR_BUFFER_BIT);//去除幀緩存 glBegin(GL_POLYGON);glColor3f(1.0,0,0); glVertex2d(-0.5,-0.5); glVertex2d(-0.5,0.5); glVertex2d(0.5,0.5); glVertex2d(0.5,-0.5); glEnd();
glFlush();}voidmain(intargc,char*argv[]){ glutCreateWindow("簡單例如"); glutDisplayFunc(mydisplay);//mydisplay是回調(diào)函數(shù) glutMainLoop();}在黃色背景中繪制一個(gè)紅色正方形4回調(diào)函數(shù)是應(yīng)用程序提供給Windows系統(tǒng)DLL或其它DLL調(diào)用的函數(shù),一般用于截獲消息、獲取系統(tǒng)信息或處理異步事件應(yīng)用程序把回調(diào)函數(shù)的地址指針告訴DLL,而DLL在適當(dāng)?shù)臅r(shí)候會(huì)調(diào)用該函數(shù)回調(diào)函數(shù)必須遵守事先規(guī)定好的參數(shù)格式和傳遞方式,否那么DLL一調(diào)用它就會(huì)引起程序或系統(tǒng)的崩潰如:glutDisplayFunc(mydisplay);//mydisplay是回調(diào)函數(shù)附:回調(diào)函數(shù)識別glutDisplayFunc5根本幾何形狀點(diǎn)、線段和多邊形Beizier曲線屬性顏色、線型〔實(shí)、虛等〕。。。變換幾何變換:平移、旋轉(zhuǎn)、縮放投影變換:正投影、透視投影輸入〔GLUT〕鍵盤和鼠標(biāo)3OpenGL函數(shù)6函數(shù)格式例如:定義點(diǎn)函數(shù)4OpenGL函數(shù)格式glVertex3f(x,y,z)glVertex3fv(p)屬于GL庫函數(shù)的功能參數(shù)的類型參數(shù)個(gè)數(shù)參數(shù)為指針注意每部分的大小寫7包含OpenGL核心庫〔GL〕OpenGL實(shí)用庫〔GLU〕OpenGL輔助庫〔GLAUX〕OpenGL工具庫〔GLUT〕OpenGL對窗口系統(tǒng)的擴(kuò)展〔WGL,等等〕功能渲染〔Rendering繪圖〕功能提供圖形繪制所需的各種功能函數(shù)窗口管理功能管理窗口系統(tǒng)的所有相關(guān)功能,如鍵盤鼠標(biāo)的響應(yīng),各種窗口事件等等5相關(guān)函數(shù)庫8OpenGL核心庫〔GL〕這局部函數(shù)用于常規(guī)的、核心的圖形處理,是OpenGL的核心局部包含300多個(gè)函數(shù),函數(shù)名前綴一律是“gl〞Windows平臺上頭文件“GL.H〞庫文件“OPENGL32.LIB〞動(dòng)態(tài)鏈接庫“OPENGL32.DLL〞核心庫可以在所有的OpenGL平臺上運(yùn)行5相關(guān)函數(shù)庫9OpenGL實(shí)用庫〔GLU〕這局部函數(shù)通過調(diào)用核心庫的函數(shù),為開發(fā)者提供相對簡單的用法,實(shí)現(xiàn)一些較為復(fù)雜的操作。如:坐標(biāo)變換、紋理映射、繪制橢球、茶壺等簡單多邊形包含約50個(gè)函數(shù),函數(shù)名前綴一律是“glu〞Windows平臺上頭文件“GLU.H〞庫文件“GLU32.LIB〞動(dòng)態(tài)鏈接庫“GLU32.DLL〞實(shí)用庫可以在所有的OpenGL平臺上運(yùn)行5相關(guān)函數(shù)庫10OpenGL輔助庫〔GLAUX〕這局部函數(shù)提供窗口管理、輸入輸出處理以及繪制一些簡單三維物體包含約30個(gè)函數(shù),函數(shù)名前綴一律是“aux〞Windows平臺上頭文件“GLAUX.H〞庫文件“GLAUX.LIB〞動(dòng)態(tài)鏈接庫“GLAUX.DLL〞OpenGL中的輔助庫不能在所有的OpenGL平臺上運(yùn)行5相關(guān)函數(shù)庫11OpenGL工具庫〔GLUT〕由MarkKilgard開發(fā)這局部函數(shù)主要提供基于窗口的工具,以及一些繪制較復(fù)雜物體的函數(shù)包含大約30多個(gè)函數(shù),函數(shù)名前綴為“glut〞文件頭文件“〞庫文件“〞動(dòng)態(tài)鏈接庫“〞glut中的窗口管理函數(shù)不依賴于運(yùn)行環(huán)境的,可以在所有的OpenGL平臺上運(yùn)行5相關(guān)函數(shù)庫125相關(guān)函數(shù)庫WGL庫:OpenGL對窗口系統(tǒng)的擴(kuò)展對于各類窗口系統(tǒng),OpenGL都提供了一個(gè)擴(kuò)展庫對于Windows系統(tǒng),OpenGL提供WGL庫并不是所有的函數(shù)前綴都是“wgl〞用于連接OpenGL和Windows,在Windows平臺上設(shè)置OpenGL環(huán)境頭文件、庫文件和動(dòng)態(tài)鏈接庫都和WindowsGDI一樣,由Windows底層提供,頭文件是“WINGDI.H〞只能在Windows平臺上運(yùn)行135相關(guān)函數(shù)庫OpenGL程序開發(fā)中,常用的函數(shù)庫組合GL+GLU+GLUT〔跨平臺〕窗口控制GLUT,采用GLUT的消息處理機(jī)制圖形繪制GL+GLU+GLUT中的繪制函數(shù)GL+GLU+WGL〔僅限于Windows程序〕窗口控制WGL,采用Windows的消息處理機(jī)制圖形繪制GL+GLU+WGL中的繪制函數(shù)入門階段,最好是使用GLUT編寫較高級的Windows相關(guān)的繪制程序時(shí),最好使用WGL14函數(shù)庫的使用方式包含各個(gè)庫的頭文件程序中直接聲明include“*.h〞引用各個(gè)庫的庫文件在開發(fā)工具的工程設(shè)置中參加對“*.lib〞的引用將各個(gè)庫的動(dòng)態(tài)鏈接庫放在系統(tǒng)目錄下或者是程序的運(yùn)行目錄下〔對于Windows2000來說是“WINNT\System32〞目錄〕〔對于WindowsXP來說是“Widows\System32〞目錄〕5相關(guān)函數(shù)庫15GLUT實(shí)例16GL運(yùn)行動(dòng)態(tài)連接庫和Windows98自帶編程環(huán)境〔Windows〕:GLUT頭文件:to$(MSDevDir)\..\..\VC98\include\GL連接庫:glut32.libto$(MSDevDir)\..\..\VC98\lib運(yùn)行庫:glut32.dllto%WinDir%\SystemOpenGL程序--GLUT17OpenGL和GLU〔Windows版〕#include<>〔必須在前面〕#include<GL/>#include<GL/>使用GLUT#include<GL/>〔不需要以上的3個(gè)頭文件〕一般還要使用以下幾個(gè)頭文件#include<>#include<>#include<>頭文件18顯示回調(diào)函數(shù)(displaycallback):mydisplay 每個(gè)GLUT程序都必須有一個(gè)顯示回調(diào)函數(shù)〔繪制圖形〕用glutDisplayFunc〔mydisplay〕函數(shù)注冊只要OpenGL確定顯示內(nèi)容要被刷新時(shí),顯示回調(diào)函數(shù)就會(huì)被調(diào)用:例如,當(dāng)窗口被翻開的時(shí)候、窗口大小改變回調(diào)函數(shù)的注冊與使用注冊函數(shù)原型:RegisterFunc(Type(*func)(ParameterList))Type定義了回調(diào)函數(shù)的返回值類型ParameterList定義了回調(diào)函數(shù)的參數(shù)列表該注冊函數(shù)對應(yīng)的回調(diào)函數(shù)原型:Typefunc(ParameterList)回調(diào)函數(shù)19常用的GLUT回調(diào)函數(shù)顯示〔Display〕:voidglutDisplayFunc(void(*func)(void))窗口發(fā)生改變〔Reshape〕:voidglutReshapeFunc(void(*func)(intwidth,intheight))鍵盤〔Keyboard〕:voidglutKeyboardFunc(void(*func)(unsignedintkey,intx,inty))鼠標(biāo)〔Mouse〕:voidglutMouseFunc(void(*func)(intbutton,intstate,intx,inty))鼠標(biāo)按鍵并移動(dòng)〔Motion〕[拖動(dòng)]:voidglutMotionFunc(void(*func)(intx,inty))后臺處理:voidglutIdleFunc(void(*func)(void))回調(diào)函數(shù)20窗口背景的顏色:設(shè)置顏色:glClearColor3f(0.0,0,0)去除幀緩存:glClear(GL_COLOR_BUFFER_BIT)事件循環(huán)函數(shù):glutMainLoopmain函數(shù)是程序進(jìn)入,事件循環(huán)做為結(jié)束創(chuàng)立的窗口和顯示的圖形被激活程序進(jìn)入檢查鼠標(biāo)或鍵盤等設(shè)備輸入的無窮循環(huán)中圖元生成函數(shù)glBegin(圖元類型);。。。glEnd();圖元類型:GL_POINTS;GL_POLYGON;GL_LINES;GL_TRIANGLE…其它常用函數(shù)21非常簡單大量使用狀態(tài)變量的默認(rèn)值視圖〔正投影和透視投影〕顏色(窗口背景、圖元)窗口參數(shù)(位置和大小)以后的程序?qū)⒏淖円恍┠J(rèn)值默認(rèn)值22創(chuàng)立一個(gè)win32consoleapplication類型的workspace文件創(chuàng)立一個(gè)C/C++文件,包含前面的代碼,并把這個(gè)文件插入到workspace文件中進(jìn)入菜單ProjectSettings…,選擇Link標(biāo)簽,在Object/librarymodules文本框中加上opengl32.libglu32.libglut32.lib,注意用空格分開如何編譯-VC62324改進(jìn)的例子:25init函數(shù)簡單初始化OpenGL自身voidinit(void){glClearColor(0.0,0.0,0.0,0.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,250.0,0.0,250.0);}改進(jìn)的例子:26繪制一條線段void
display(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glBegin(GL_LINE);
glVertex2i(180,15);
glVertex2i(10,130);glEnd();
glutSwapBuffers();}改進(jìn)的例子:27鍵盤消息回調(diào)函數(shù)當(dāng)按下“ESC〞鍵時(shí)程序退出voidkeyboard(unsignedcharkey,intx,inty){switch(key){case27:exit(0);break;}}改進(jìn)的例子:28鼠標(biāo)消息回調(diào)函數(shù)當(dāng)點(diǎn)擊鼠標(biāo)左鍵時(shí)程序退出void
mouse(int
button,int
state,int
x,int
y){
switch(button){
case
GLUT_LEFT_BUTTON:
exit(0);
break;}}改進(jìn)的例子:29改變窗口大小當(dāng)程序啟動(dòng)或改變窗口大小voidReshape(intwidth,intheight){ glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();
// gluOrtho2D(0.0,width,0.0,height); gluOrtho2D(-width/2,width/2,-height/2,height/2);
::glMatrixMode(GL_MODELVIEW);::glLoadIdentity();}改進(jìn)的例子:30所有使用GLUT的OpenGL程序的模式都與本例相似實(shí)現(xiàn)main函數(shù),初始化OpenGL環(huán)境,調(diào)用init,注冊各個(gè)回調(diào)函數(shù),進(jìn)入主循環(huán)實(shí)現(xiàn)init函數(shù)實(shí)現(xiàn)各個(gè)回調(diào)函數(shù)通用模板31WGL實(shí)例32初始化OpenGL環(huán)境指定像素格式〔Pixelformat〕初始化OpenGL窗口去除OpenGL環(huán)境使用雙緩存程序模板一個(gè)簡單的例子使用WGL函數(shù)庫33生成程序框架RunVisualC++6.0IDE.FromtheFilemenucreateanewworkspacebychoosingNewoption.ChooseMFCAppWizard(exe)astheprojecttype.EnterprojectnameasOpenGLandChooseanappropriatelocationInthewizard,choosetheoption
SingleDocumentandremovePrintingandPrintPreview
andacceptallotherdefaults.CompileandExecutethecode.使用WGL函數(shù)庫34設(shè)置編譯環(huán)境1.在OpenGLView.h內(nèi)各加上:
#include<GL/>#include<GL/>#include<GL/>
#include<GL\>
2.在集成環(huán)境中,
Project|Settings|Link|Object/librarymodule|“opengl32.libglu32.libglut32.lib"使用WGL函數(shù)庫35設(shè)置OpenGL工作環(huán)境〔中〕1.處理PreCreateWindow():設(shè)置OpenGL繪圖窗口的風(fēng)格|=WS_CLIPSIBLINGS|WS_CLIPCHILDREN
2.在中添加變量和成員函數(shù)聲明HGLRCm_hRC;//RenderingContext
CDC*m_pDC;//DeviceContextBOOLInitializeOpenGL();BOOLSetupPixelFormat();使用WGL函數(shù)庫363.生成OnCreate()〔WM_CREATE消息〕函數(shù),并添加代碼intCOpenGLView::OnCreate(LPCREATESTRUCTlpCreateStruct){ if(CView::OnCreate(lpCreateStruct)==-1) return-1;
//TODO:Addyourspecializedcreationcodehere //InitializeOpenGLHere InitializeOpenGL();
return0;}使用WGL函數(shù)庫374.InitializeOpenGL()BOOLCOpenGLView::InitializeOpenGL(){
//GetaDCfortheClientArea
m_pDC=newCClientDC(this)
//FailuretoGetDC
if(m_pDC==NULL)
{
MessageBox("ErrorObtainingDC");
returnFALSE;
}
//Failuretosetthepixelformat
if(!SetupPixelFormat())
{
returnFALSE;
}使用WGL函數(shù)庫
38
//CreateRenderingContext
m_hRC=::wglCreateContext(m_pDC->GetSafeHdc());
//FailuretoCreateRenderingContext
if(m_hRC==0)
{
MessageBox("ErrorCreatingRC");
returnFALSE;
}
//MaketheRCCurrent
if(::wglMakeCurrent(m_pDC->GetSafeHdc(),m_hRC)==FALSE)
{
MessageBox("ErrormakingRCCurrent");
returnFALSE;
}
使用WGL函數(shù)庫
39
//SpecifyBlackastheclearcolor
::glClearColor(0.0f,0.0f,0.0f,0.0f);
//Specifythebackofthebufferascleardepth
::glClearDepth(1.0f);
//EnableDepthTesting
::glEnable(GL_DEPTH_TEST);
}使用WGL函數(shù)庫405.BOOLCOpenGLView::SetupPixelFormat()//指定像素格式〔Pixelformat〕{staticPIXELFORMATDESCRIPTORpfd={sizeof(PIXELFORMATDESCRIPTOR),//sizeofthispfd1,//versionnumberPFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL//supportwindow|supportOpenGL||PFD_DOUBLEBUFFER,//doublebufferedPFD_TYPE_RGBA,//RGBAtype24,//24-bitcolordepth0,0,0,0,0,0,//colorbitsignored0,0,//noalphabuffer//shiftbitignored0,//noaccumulationbuffer0,0,0,0,//accumbitsignored16,0,//16-bitz-buffer//nostencilbuffer0,PFD_MAIN_PLANE,0,//noauxiliarybuffer//mainlayer//reserved0,0,0//layermasksignored};
intm_nPixelFormat=::ChoosePixelFormat(m_pDC->GetSafeHdc(),&pfd);if(m_nPixelFormat==0)returnFALSE;if(::SetPixelFormat(m_pDC->GetSafeHdc(),m_nPixelFormat,&pfd)==FALSE)returnFALSE;returnTRUE;}使用WGL函數(shù)庫416.處理OnDestroy()voidCOpenGLView::OnDestroy(){wglMakeCurrent(m_pDC->m_hDC,NULL);//釋放與m_hDC對應(yīng)的RC
wglDeleteContext(m_hRC);//刪除RCif(m_pDC)
deletem_pDC;//刪除當(dāng)前View擁有的DC CView::OnDestroy();}7.處理OnEraseBkgnd()BOOLCOpenGLView::OnEraseBkgnd(CDC*pDC){//TODO:Addyourmessagehandlercodehereand/orcalldefault
//returnCView::OnEraseBkgnd(pDC);
//把這句話注釋掉,否那么,Window會(huì)用白色北景來刷新,導(dǎo)致畫面閃爍
returnTRUE;//只要空返回即可。}使用WGL函數(shù)庫428.處理OnSize()voidCOpenGLView::OnSize(UINTnType,intcx,intcy){ CView::OnSize(nType,cx,cy);
if(0>=cx||0>=cy)return; ::glViewport(0,0,cx,cy);//selectthefullclientarea//selecttheprojectionmatrixandclearit::glMatrixMode(GL_PROJECTION);::glLoadIdentity(); gluOrtho2D(-cx/2,cx/2,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2026學(xué)年蘇科版九年級數(shù)學(xué)上冊期末模擬試卷3(含答案)
- 【寒假復(fù)習(xí)】人教版五年級數(shù)學(xué)上冊小數(shù)乘除四則混合運(yùn)算應(yīng)用題專項(xiàng)訓(xùn)練(含答案)
- 化工儀表巡檢安全課件
- 2026山東淄博桓臺縣面向退役大學(xué)生士兵專項(xiàng)崗位招聘備考考試題庫及答案解析
- 2026年德宏州瑞麗市幼兒教育集團(tuán)招聘合同制臨聘人員(16人)考試備考試題及答案解析
- 2026年上半年云南能源職業(yè)技術(shù)學(xué)院招聘人員(21人)參考考試題庫及答案解析
- 2026福建福州市教育局公費(fèi)師范生專項(xiàng)招聘92人參考考試題庫及答案解析
- 2026廣西北海市合浦縣委黨校招錄城鎮(zhèn)公益性崗位人員1人備考考試題庫及答案解析
- 關(guān)于管理制度規(guī)劃的論文(3篇)
- 后勤專用通道管理制度范本(3篇)
- 高三英語一輪復(fù)習(xí)北師大版選擇性單詞默寫本
- JB-T 10833-2017 起重機(jī)用聚氨酯緩沖器
- 項(xiàng)目二 模塊四 波音737-800飛機(jī)乘務(wù)員控制面板及娛樂系統(tǒng)的操作方法課件講解
- 2022年新疆維吾爾自治區(qū)新疆生產(chǎn)建設(shè)兵團(tuán)中考數(shù)學(xué)試題(無答案)
- 福建省福州市2023-2024學(xué)年高一上學(xué)期期末考試物理試卷2
- 鋼結(jié)構(gòu)生產(chǎn)工藝流程
- 2022-2023學(xué)年四川省宜賓市高一(下)期末數(shù)學(xué)試卷(含解析)
- 教你填《廣東省普通高中學(xué)生檔案》精編版
- 大學(xué)生兼職家教個(gè)人簡歷
- 轉(zhuǎn)動(dòng)極板技術(shù)簡介
- 《人類行為與社會(huì)環(huán)境》課件
評論
0/150
提交評論