3-1計算機圖形學-OpenGL教程-1_第1頁
3-1計算機圖形學-OpenGL教程-1_第2頁
3-1計算機圖形學-OpenGL教程-1_第3頁
3-1計算機圖形學-OpenGL教程-1_第4頁
3-1計算機圖形學-OpenGL教程-1_第5頁
已閱讀5頁,還剩95頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第一講基本概念..................................................................2

1.1、OpenGL的特點及功能..................................................2

1.2、OpenGL工作流程......................................................4

1.3、Windows中OpenGL庫函數(shù)及數(shù)據(jù)類型..................................5

第二講OpenGL中的二維編程....................................................10

2.1一個簡單的示例程序.....................................................10

2.2GLUT........................................................................................................................11

2.3.時間循環(huán)和回調函數(shù)....................................................11

2.4.OpenGL中的顏色設置..................................................11

2.5.二維取景..............................................................14

2.6.視口設置..............................................................14

2.7.坐標系與變換..........................................................14

2.8.較完整的程序..........................................................14

2.9.基本圖元的繪制........................................................14

291、基本圖元的描述及定義............................................14

2.9.2、OpenGL中的顏色................................................16

2.9.3、點(Point).......................................................................................................20

295、多邊形(Polygon)...........................................................................................22

296、法向量的計算及指定..............................................25

297、顯示列表.........................................................26

2.9.8、文本............................................................31

2.9.9、查詢與錯誤......................................................32

2.9.10,狀態(tài)的保存.....................................................32

2.9.11,一個簡單的例子.................................................32

第三講.交互與動畫...............................................................36

3.1、菜單..................................................................36

3.2、鍵盤的使用............................................................40

3.3、鼠標的使用............................................................43

3.4、子窗口與多窗口.......................................................43

3.5、拾取和選擇模式.......................................................44

3.6、幾個回調函數(shù)..........................................................44

3.7、雙緩存................................................................44

第四講三維編程基礎............................................................44

第五講坐標變換................................................................44

5.1>OpenGL中的三維物體的顯示..........................................44

5.2>OpenGL中的幾種變換................................................46

第六講堆棧操作.................................................................53

第七講?.......................................................................56

第八講使用光照和材質..........................................................56

第九講紋理映射.................................................................59

第十講特殊效果操作............................................................63

第十一講曲線和曲面............................................................71

11.1、曲線的繪制...........................................................72

11.2、曲面構造.............................................................75

11.3、圖元逼近法繪制三維物體...............................................79

第十二講繪制NURBS曲線和曲面................................................80

第十三講二次幾何體............................................................88

第十四講像素操作..............................................................93

第十五講動畫制作..............................................................98

OpenGL教程

在這個系列講座中介紹了有關OpenGL的基本知識,主要涉及顏色、繪制幾何

體、坐標變換、堆棧操作、顯示列表、光照和材質、紋理映射、特殊效果、曲面

和曲線的繪制、二次幾何體繪制、像素操作、如何繪制動畫物體及菜單管理。通

過對講座中提供的實例的理解消化,讀者可以較容易地進入OpenGL的世界。

第一講基本概念

前言

隨著計算機多媒體技術、可視化技術及圖形學技術的發(fā)展,我們可以使用計

算機來精確地再現(xiàn)現(xiàn)實世界中的絢麗多彩的三維物體,并充分發(fā)揮自身的創(chuàng)造性

思維,通過人機交互來模擬、改造現(xiàn)實世界,這就是目前最為時髦的虛擬現(xiàn)實技

術。通過這種技術,建筑工程師可以直接設計出美觀的樓房模型;軍事指揮員可

以模擬戰(zhàn)場進行軍事推演,網民可以足不出戶游覽故宮博物館等名勝古跡等。而

虛擬現(xiàn)實技術最重要的一部分內容就是三維圖形編程。當前,三維圖形編程工具

中最為突出的是SGI公司的OpenGL(OpenGraphicsLanguage,開放式的圖

形語言),它已經成為一個工業(yè)標準的計算機三維圖形軟件開發(fā)接口,并廣泛應

用于游戲開發(fā)、建筑、產品設計、醫(yī)學、地球科學、流體力學等領域。值得一提

的是,雖然微軟有自己的三維編程開發(fā)工具DirectX,但它也提供OpenGL圖形

標準,因此,OpenGL可以在微機中廣泛應用。

目前,OpenGL在國內外都掀起了熱潮,但國內對這一領域介紹的資料并不

是很多,特別是有志于在圖形圖像方面進行深入研究的讀者朋友,常常苦于不掌

握OpenGL編程接口技術,無法向縱深領域擴展。為了開啟三維圖形編程這扇

神秘大門,本講座在結合OpenGL有關理論知識的基礎上,著重介紹Visual

C++6.0開發(fā)環(huán)境中的編程實現(xiàn),由于水平有限,本講座可能無法面面俱到,存

在一些疏漏,但相信它可以將開啟"神秘大門”的鑰匙交給讀者朋友們。

1.1、OpenGL的特點及功能

OpenGL是用于開發(fā)簡捷的交互式二維和三維圖形應用程序的最佳環(huán)境,任

何高性能的圖形應用程序,從3D動畫、CAD輔助設計到可視化訪真,都可以

利用OpenGL高質量、高性能的特點。OpenGL自1992年出現(xiàn)以來,逐漸發(fā)展

完善,已成為一個唯一開放的,獨立于應用平臺的圖形標準,一個典型的OpenGL

應用程序可以在任何平臺上運行-只需要使用目標系統(tǒng)的OpenGL庫重新編譯

一下。

OpenGL非常接近硬件,是一個圖形與硬件的接口,包括了100多個圖形

函數(shù)用來建立三維模型和進行三維實時交互。OpenGL強有力的圖形函數(shù)不要求

開發(fā)人員把三維物體模型的數(shù)據(jù)寫成固定的數(shù)據(jù)格式,也不要求開發(fā)人員編寫矩

陣變換、外部設備訪問等函數(shù),大大地簡化了編寫三維圖形的程序。例如:

1)OpenGL提供一系列的三維圖形單元(圖元)供開發(fā)者調用。

2)OpenGL提供一系列的圖形變換函數(shù)。

3)OpenGL提供一系列的外部設備訪問函數(shù),使開發(fā)者可以方便地訪問鼠

標、鍵盤、空間球、數(shù)據(jù)手套等外部設備。

由于微軟在Windows中包含了OpenGL,所以OpenGL可以與VisualC++

緊密接合,簡單快捷地實現(xiàn)有關計算和圖形算法,并保證算法的正確性和可靠性。

簡單地說,OpenGL具有建模、變換、色彩處理、光線處理、紋理影射、圖像處

理、動畫及物體運動模糊等功能:

1、建模

OpenGL圖形庫除了提供基本的點、線、多邊形的繪制函數(shù)外,還提供了復

雜的三維物體,如球、錐、多面體、茶壺以及復雜曲線和曲面(例如Bezier、

Nurbs等曲線或曲面)的繪制函數(shù)。

2、變換

OpenGL圖形庫的變換包括基本變換和投影變換?;咀儞Q有平移、旋轉、

變比、鏡像四種變換,投影變換有平行投影(又稱正射投影)和透視投影兩種變

換。

3、顏色模式設置

OpenGL顏色模式有兩種,即RGBA模式和顏色索引(ColorIndex)。

4、光照和材質設置

OpenGL光有輻射光(EmittedLight)、環(huán)境光(AmbientLight)>漫反射

光(DiffuseLight)和鏡面光(SpecularLight)0材質是用光反射率來表示???/p>

觀世界中的物體最終反映到人眼的顏色是光的紅綠藍分量與材質紅綠藍分量的

反射率相乘后形成的顏色。

5、紋理映射(TextureMapping)

利用OpenGL紋理映射功能可以十分逼真地表達物體表面細節(jié)。

6、位圖顯示和圖象增強

OpenGL的圖象功能除了基本的拷貝和像素讀寫外,還提供融合

(Blending)>反走樣(Antialiasing)和霧(fog)的特殊圖象效果處理。以上

三條可是被仿真物更具真實感,增強圖形顯示的效果。

7、雙緩存動畫(DoubleBuffering)

OpenGL使用了前臺緩存和后臺緩存交替顯示場景(Scene)技術,簡而言

之,后臺緩存計算場景、生成畫面,前臺緩存顯示后臺緩存已畫好的畫面。

8、特殊效果

利用OpenGL還能實現(xiàn)深度暗示(DepthCue)、運動模糊(MotionBlur)

等特殊效果。運動模糊的繪圖方式(motion-blured),模擬物體運動時人眼觀

察所感覺的動感現(xiàn)象。深度域效果(depth-of-effects),類似于照相機鏡頭效果,

模型在聚焦點處清晰,反之則模糊。

這些三維物體繪圖和特殊效果處理方式,說明OpenGL能夠模擬比較復雜

的三維物體或自然景觀。

1.2、OpenGL工作流程

OpenGL的基本工作流程如下圖:

如上圖所示,幾何頂點數(shù)據(jù)包括模型的頂點集、線集、多邊形集,這些數(shù)據(jù)

經過流程圖的上部,包括運算器、逐個頂點操作等;圖像數(shù)據(jù)包括象素集、影像

集、位圖集等,圖像象素數(shù)據(jù)的處理方式與幾何頂點數(shù)據(jù)的處理方式是不同的,

但它們都經過光柵化、逐個片元(Fragment)處理直至把最后的光柵數(shù)據(jù)寫入

幀緩沖器。

在OpenGL中的所有數(shù)據(jù)包括幾何頂點數(shù)據(jù)和象素數(shù)據(jù)都可以被存儲在顯

示列表中或者立即可以得到處理。OpenGL中,顯示列表技術是一項重要的技術。

OpenGL要求把所有的幾何圖形單元都用頂點來描述,這樣運算器和逐個頂

點計算操作都可以針對每個頂點進行計算和操作,然后進行光柵化形成圖形碎

片;對于象素數(shù)據(jù),象素操作結果被存儲在紋理組裝用的內存中,再象幾何頂點

操作一樣光柵化形成圖形片元。整個流程操作的最后,圖形片元都要進行一系列

的逐個片元操作,這樣最后的象素值送入幀緩沖器實現(xiàn)圖形的顯示。

根據(jù)這個流程,我們可以歸納出在OpenGL中進行主要的圖形操作直至在

計算機屏幕上渲染繪制出三維圖形景觀的基本步驟:

1)根據(jù)基本圖形單元建立景物模型,并且對所建立的模型進行數(shù)學描述

(OpenGL中把:點、線、多邊形、圖像和位圖都作為基本圖形單元)。

2)把景物模型放在三維空間中的合適的位置,并且設置視點(viewpoint)

以觀察所感興趣的景觀。

3)計算模型中所有物體的色彩,其中的色彩根據(jù)應用要求來確定,同時確

定光照條件、紋理粘貼方式等。

4)把景物模型的數(shù)學描述及其色彩信息轉換至計算機屏幕上的象素,這個

過程也就是光柵化(rasterization)o

在這些步驟的執(zhí)行過程中,OpenGL可能執(zhí)行其他的一些操作,例如自動消

隱處理等。另外,景物光柵化之后被送入幀緩沖器之前還可以根據(jù)需要對像素數(shù)

據(jù)進行操作。

1.3、Windows中OpenGL庫函數(shù)及數(shù)據(jù)類型

(一)庫函數(shù)

開發(fā)基于OpenGL的應用程序,必須先了解OpenGL的庫函數(shù)。它采用C

語言風格,提供大量的函數(shù)來進行圖形的處理和顯示。OpenGL圖形庫一共有

100多個函數(shù),它們分別屬于OpenGL的基本庫、實用庫、輔助庫等不同的庫。

1、核心庫,包含的函數(shù)有115個,它們是最基本的函數(shù),其前綴是gl;這

部分函數(shù)用于常規(guī)的、核心的圖形處理,由gl.dll來負責解釋執(zhí)行。核心庫中的

函數(shù)可以進一步分為以下幾類函數(shù)。

(1)繪制基本幾何圖元的函數(shù)。

glBegain()>glEnd()>glNormal*()>glVertex*()0

(2)矩陣操作、幾何變換和投影變換的函數(shù)。

矩陣入棧函數(shù)glPushMatrix(),矩陣出棧函數(shù)glPopMatrix。,裝載矩陣函數(shù)

glLoadMatrix(),矩陣相乘函數(shù)glMultMatrix。,當前矩陣函數(shù)glMatrixMode()和

矩陣標準化函數(shù)glLoadldentity。,幾何變換函數(shù)glTrans山te*()、gIRotate*。和

glScale*(),投影變換函數(shù)glOrtho。、glFrustum。和視口變換函數(shù)glViewport。

(3)顏色、光照和材質的函數(shù)。

如設置顏色模式函數(shù)glColor*。、gllndex*()>設置光照效果的函數(shù)

gILight*。、gILightModel*。和設置材質效果函數(shù)glMaterial。等等。

(4)顯示列表函數(shù)。

主要有創(chuàng)建、結束、生成、刪除和調用顯示列表的函數(shù)glNewList。、

glEndList。、glGenLists()>glCallList()和glDeleteLists。等。

(5)紋理映射函數(shù)。

主要有一維紋理函數(shù)gITexImagelD()>二維紋理函數(shù)glTexlmage2D()>設

置紋理參數(shù)、紋理環(huán)境和紋理坐標的函數(shù)glTexParameter*。、glTexEnv*()和

gITetCoord*。等。

(6)特殊效果函數(shù)。

融合函數(shù)glBlendFunc()>反走樣函數(shù)glHint。和霧化效果gFog*()。

(7)光柵化、象素操作函數(shù)。

像素位置gIRasterPos*。、線型寬度glLineWidth。、多邊形繪制模式

glPolygonMode(),讀取象素glReadPixel。、復制象蓑glCopyPixel()等。

(8)選擇與反饋函數(shù)。

主要有渲染模式glRenderMode()>選擇緩沖區(qū)glSelectBuffer。和反饋緩沖

區(qū)glFeedbackBuffer。等。

(9)曲線與曲面的繪制函數(shù)。

生成曲線或曲面的函數(shù)glMap*()、glMapGrid*(),求值器的函數(shù)

glEvalCoord*()glEvalMesh*()o

(10)狀態(tài)設置與查詢函數(shù)。主要有glGet*()、glEnable(),glGetError()等。

2、實用庫(OpenGLutilitylibrary,GLU),包含的函數(shù)功能更高一些,如

繪制復雜的曲線曲面、高級坐標變換、多邊形分割等,共有43個,前綴為glu。

Glu函數(shù)通過調用核心庫的函數(shù),為開發(fā)者提供相對簡單的用法,實現(xiàn)一些較為

復雜的操作。此類函數(shù)由glu.dll來負責解釋執(zhí)行。主要包括了以下幾種:

(1)輔助紋理貼圖函數(shù)。

WgluScalelmage()、gluBuildlDmipmaps()>gluBuild2Dmipmaps()等。

(2)坐標轉換和投影變換函數(shù)。

定義投影方式函數(shù)gluPerspective。、gluOrtho2D()>gluLookAt(),拾取投

影視景體函數(shù)gluPickMatrix(),投影矩陣計算gluProject。和gluUnProject。等。

(3)多邊形鑲嵌工具。

有gluNewTess()>gluDeleteTess()、gluTessCallback()、gluBeginPolygon()

gluTessVertex。、gluNextContour()>gluEndPolygon。等。

(4)二次曲面繪制工具。

主要有繪制球面、錐面、柱面、圓環(huán)面gluNewQuadric。、gluSphere。、

gluCylinder()>gluDisk。、gluPartialDisk()>gluDeleteQuadric。等等。

(5)非均勻有理B樣條繪制工具。

主要用來定義和繪制Nurbs曲線和曲面,包括gluNewNurbsRenderer。、

gluNurbsCurve()>gluBeginSurface()>gluEndSurface()>gluBeginCurve。、

gluNurbsProperty。等函數(shù)。

(6)錯誤反饋工具。

獲取出錯信息的字符串gluErrorString()^o

3^OpenGL輔助庫(OpenGLauxiliarylibrary,GLALIX),包括簡單的窗

口管理、輸入事件處理、某些復雜三維物體繪制等函數(shù),共有31個,前綴為auxo

此類函數(shù)由glaux.dll來負責解釋執(zhí)行。輔助庫函數(shù)主要包括以下幾類。

(1)窗口初始化和退出函數(shù)。

auxlnitDisplayMode()和auxlnitPosition()o

(2)窗口處理和時間輸入函數(shù)。

auxReshapeFunc()>auxKeyFunc。和auxMouseFunc()o

(3)顏色索引裝入函數(shù)。

auxSetOneColor()o

(4)三維物體繪制函數(shù)。

包括了兩種形式網狀體和實心體,如繪制立方體auxWireCube()和

auxSolidCube()0這里以網狀體為例,長方體auxWireBox。、環(huán)形圓紋面

auxWireTorus()>圓柱auxWireCylinder。、二十面體auxWirelcosahedron。、

八面體auxWireOctahedron。、四面體auxWireTetrahedron。、十二面體

auxWireDodecahedron。、圓錐體auxWireCone。和茶壺auxWireTeapot。。繪

制實心體只要將上述函數(shù)中的確"Wire"更換成"Solid”就可以了。

(5)其他。

背景過程管理函數(shù)auxldleFunc();程序運行函數(shù)auxMainLoop()o

4、OpenGL工具庫(penGLUtilityToolkit)

包含大約30多個函數(shù),函數(shù)名前綴為glut,此函數(shù)由glut.dll來負責解釋執(zhí)

行。這部分函數(shù)主要包括:

(1)窗口操作函數(shù)

窗口初始化、窗口大小、窗口位置等函數(shù)glutlnit()glutimtDisplayMode()、

glutlnitWindowSize()glutlnitWindowPosition。等。

(2)回調函數(shù)。

響應刷新消息、鍵盤消息、鼠標消息、定時器函數(shù)等,GlutDisplayFunc()>

glutPostRedisplay()xglutReshapeFunc。、glutTimerFunc()>

glutKeyboardFunc()>glutMouseFunc()o

(3)創(chuàng)建復雜的三維物體。這些和aux庫的函數(shù)功能相同。創(chuàng)建網狀體和

實心體。如glutSol如Sphere。、glutWireSphere()等。

(4)菜單函數(shù)

創(chuàng)建添加菜單的函數(shù)GlutCreateMenu。、glutSetMenu。、

glutAddMenuEntry()>glutAddSubMenu()和glutAttachMenu。。

(5)程序運行函數(shù)。

glutMainLoop()o

5、16個WGL函數(shù),專門用于OpenGL和Windows窗口系統(tǒng)的聯(lián)接,其

前綴為wgl,主要用于創(chuàng)建和選擇圖形操作描述表(renderingcontexts)以及在

窗口內任一位置顯示字符位圖。這類函數(shù)主要包括以下幾類

(1)繪圖上下文相關函數(shù)。

wglCreateContext()>wglDeleteContext()>wglGetCurrentContent()>

wglGetCurrentDC()wglDeleteContent。等。

(2)文字和文本處理函數(shù)。

wglUseFontBitmaps。、wglUseFontOutlines()o

(3)覆蓋層、地層和主平面層處理函數(shù)。

wglCopyContext()xwgICreateLayerP山ne()、wglDescribeLayerPlane()>

wgIReakizeLayerPIatte()等。

(4)其他函數(shù)。

wglShareLists()>wglGetProcAddress。等。

6、另外,還有五個Win32函數(shù)用來處理像素格式(pixelformats)和雙緩

存。由于它們是對Win32系統(tǒng)的擴展,因此不能應用在箕它OpenGL平臺上。

(二)OpenGL數(shù)據(jù)類型

與C語言相對應,OpenGL中也有整數(shù)、字節(jié)、浮點數(shù)等數(shù)據(jù)類型,為了

說明兩者的對應關系,下表將OpenGL的數(shù)據(jù)類型與相應的C類型進行了對比:

表一、OpenGL數(shù)據(jù)類型表

前綴數(shù)據(jù)類型相應C語言類型OpenGL類型

b8-bitintegersignedcharGLbyte

S16-bitintegershortGLshort

i32-bitintegerlongGLint,GLsizei

f32-bitfloating-pointfloatGLfloat,GLclampf

d64-bitfloating-pointdoubleGLdouble.GLclampd

ub8-bitunsignedintegerunsignedcharGLubyte,GLboolean

US16-bitunsignedintegerunsignedshortGLushort

ui32-bitunsignedintegerunsignedlongGLuint,GLenum,GLbitfield

此外,OpenGL也定義GLvoid類型,如果用C語言編寫,可以用它替代

void類型。

(三)OpenGL庫函數(shù)的命名規(guī)律

了解了OpenGL的數(shù)據(jù)類型,讓我們再回過頭來看看OpenGL庫函數(shù)的命

名規(guī)律。所有OpenGL函數(shù)采用了以下格式:

〈庫前綴><根命令><可選的參數(shù)個數(shù)〉〈可選的參數(shù)類型,

庫前綴有gl、glu、aux、glut、wgl>glx等等,分別表示該函數(shù)屬于OpenGL

某開發(fā)庫等,從函數(shù)名后面中還可以看出需要多少個參數(shù)以及參數(shù)的類型。I代

表int型,f代表float型,d代表double型,u代表無符號整型。注意,有的函

數(shù)參數(shù)類型后綴前帶有數(shù)字2、3、4o2代表二維,3代表三維,4代表alpha

值(以后介紹)。有些OpenGL函數(shù)最后帶一個字母v,表示函數(shù)參數(shù)可用一個

指針指向一個向量(或數(shù)組)來替代一系列單個參數(shù)值。下面兩種格式都表示設

置當前顏色為紅色,二者等價。

glColor3f(1.0Q.0Q.0);等價于:

floatcolor_array[]={1.0,0.0,0.0};

glColor3fv(color_array);

除了以上基本命名方式外,還有一種帶"*"星號的表示方法,例如glColor*。,

它表示可以用函數(shù)的各種方式來設置當前顏色。同理,glVertex*v()表示用一個

指針指向所有類型的向量來定義一系列頂點坐標值。

第二講OpenGL中的二維編程

任何復雜的三維模型都是由基本的幾何圖元:點、線段和多邊形組成的,有了這

些圖元,就可以建立比較復雜的模型。因此這部分內容是學習OpenGL編程的

基礎。

2.1一個簡單的示例程序

#include<glut.h>

voiddisplayO

(

glClear(GL_COLOR_BUFFER_BIT);

glBegin(GL_POLYGON);

glVertex2f(-0.5,-0.5);

glVertex2f(-0.5,0.5);

glVertex2f(0.5,0.5);

glVertex2f(0.5,-0.5);

glEnd();

glFlush();

intmain(intargc,char**argv)

(

glutlnit(&argc,argv);

glutCreateWindow("simple")

glutDisplayFunc(display);

glutMainLoopO;

)

程序運行結果為一個矩形:

2.2GLUT

glut是OpenGL的跨平臺工具庫"GLUT"[I]全稱為OpenGLUtilityToolkit.[/I]MarkJ.

Kilgard創(chuàng)作的GLUT庫,是我們創(chuàng)建完全獨立于窗口系統(tǒng)的OpenGL程序成為可能.感

謝GLUT,我們能夠在不了解XWindows或者MicrosoftWindows窗口系統(tǒng)本身的情況

下編寫3D應用程序.Kilgard編寫了GLUT的XWindows版本,后來NateRobins又將之

移植到MicrosoftWindows系統(tǒng)之上.

2.3.時間循環(huán)和回調函數(shù)

2.4.OpenGL中的顏色設置

例2:本例子使用顏色引索模式繪制8個不同顏色的球體,如圖二所示。閱

讀此例時,請主要關注函數(shù)palette和DrawColotFans。

gllndex設置當前顏色索引。參數(shù)為當前顏色索引。本例中gllndexd函數(shù)的參數(shù)

j+1對應palette中auxSetOneColor函數(shù)中的i+1,auxSetOneColor函數(shù)的后

三個函數(shù)制定對應的顏色,顏色值由變量rgb[8][3]定義。

include<GL/glut.h>

include<GL/glaux.h>

voidinit(void)

(

glClearColor(1.0,1.0,1.0,1.0);

glClear(GL_COLOR_BUFFER_BIT);

glShadeModel(GL_SMOOTH);

voidpalette(void)

|

GLinti;

staticGLfloatrgb[8][3]={{1,0,0},{1,0,0.5},{1,0,1},

{0,0,1},{0,1,1},{0,1,0},{1,1,0},{1,0.5,0}};

for(i=0;i<8;i++)

(

auxSetOneColor(i+1,rgb皿O],rgb皿1],rgb[i][2]);〃設置顏色

voidDrawColorFans(void)

(

GLintj;

glTranslatef(-15,-15,0);

for(j=0;j<8;j++)

(

gllndexd(j+1);〃設置當前顏色索引

/*在不同位置繪制球體*/

glTranslatef(j,j-1,0);

glutSolidSphere(1,20,20);

voidCALLBACKdisplay(void)

(

palette();

DrawColorFans();

glFlush();

voidCALLBACKreshape(GLsizeiw,GLsizeih)

|

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadldentity();

gluPerspective(100,1,1,20);

glMatrixMode(GL_MODELVIEW);

glLoadldentity();

glTranslatef(0,0,-15);

}

voidmain()

(

auxlnitDisplayMode(AUX_SINGLE|AUX_INDEX);

auxlnitPosition(100,100,500,500);

auxlnitWindow("drawthecolorsphere");

init();

auxReshapeFunc(reshape);

auxMainLoop(display);

圖二:8個不同顏色的球體

25二維取景

26視口設置

27坐標系與變換

28較完整的程序

2.9.基本圖元的繪制

2.9.1、基本圖元的描述及定義

OpenGL圖元是抽象的幾何概念,不是真實世界中的物體,因此須用相關的

數(shù)學模型來描述。所有的圖元都是由一系列有順序的頂點集合來描述的。

OpenGL.中繪制幾何圖元,必須使用glBegain。和glEnd()這一對函數(shù),傳遞給

gBegain()函數(shù)的參數(shù)唯一確定了要繪制何種幾何圖元,同時,在該函數(shù)對中給

出了幾何圖元的定義,函數(shù)glEnd()標志頂點列表的結束。例如,下面的代碼繪

制了一個多邊形:

glBegin(GL_POLYGON);

glVertex2f(0.0,0.0);

glVertex2f(0.0,3.0);

glVertex2f(3.0,3.0);

gIVertex2f(4.0,1.5);

glVertex2f(3.0,0.0);

glEnd();

函數(shù)glBegin(GLenummode)標志描述一個幾何圖元的頂點列表的開始,其

參數(shù)mode表示幾何圖元的描述類型,具體類型見表一:

表一、幾何圖元類型說明

類型說明

GL_POINTS單個頂點集

GL_LINES多組雙頂點線段

GL_POLYGON單個簡單填充凸多邊形

GL_TRAINGLES多組獨立填充三角形

GL_QUADS多組獨立填充四邊形

GL_LINE_STRIP不閉合折線

GL_LINE_LOOP閉合折線

GL_TRAINGLE_STRIP線型連續(xù)填充三角形串

GL_TRAINGLE_FAN扇形連續(xù)填充三角形串

GL_QUAD_STRIP連續(xù)填充四邊形串

部分幾何圖元的示意圖:

GLLINELOOPGLQIADSGLQIAPSTRIP

圖一、部分幾何圖元示意圖

在glBegin。和glEnd()之間最重要的信息就是由函數(shù)gIVertex*。定義的頂點,

必要時也可為每個頂點指定顏色(只對當前點或后續(xù)點有效)、法向、紋理坐標

或其他,即調用相關的函數(shù):

表二、在g舊egin()和glEnd()之間可調用的函數(shù)

函數(shù)函數(shù)意義

glColor*()設置當前顏色

gllndex*()設置當前顏色表

glNormal*()設置法向坐標

glEvalCoord*()產生坐標

glCallList(),glCallLists()顯示列表

glTexCoord*()設置紋理坐標

glEdgeFlag*()控制邊界繪制

glMaterial*()設置材質

需要指出的是:OpenGL所定義的點、線、多邊形等圖元與一般數(shù)學定義不

太一樣,存在一定的差別。一種差別源于基于計算機計算的限制。OpenGL中所

有浮點計算精度有限,故點、線、多邊形的坐標值存在一定的誤差。另一種差

別源于位圖顯示的限制。以這種方式顯示圖形,最小的顯示圖元是一個象素,盡

管每個象素寬度很小,但它們仍然比數(shù)學上所定義的點或線寬要大得多。當用

OpenGL進行計算時,雖然是用一系列浮點值定義點串,但每個點仍然是用單個

象素顯示,只是近似擬合。

2.9.2、OpenGL中的顏色

OpenGL顏色設置有換們的函數(shù),主要如下:

一、gIShadeModel

選擇平面明暗模式或光滑明暗模式

voidglShadeModel(GLenummode)

參數(shù):mode指定表示明暗模式的符號值,可選GL-FLAT和GL_SMOOTH,缺省值為

GL_SMOOTH

二、glColor

設置當前顏色

這是一個家族性質的函數(shù)集合,并沒有glColor()這個函數(shù)。其包含的函數(shù)如下:

voidglColor3b(GLbytered,GLbytegreen,GLbyteblue)

voidglColor3d(GLdoublered,GLdoublegreen,GLdoubleblue)

voidglColor3f(GLfloatred,GLfloatgreen,GLfloalblue)

voidglColor3i(GLintred,GLintgreen,GLintblue)

voidglColor3s(GLshortred,GLshortgreen,GLshortblue)

voidglColor3ub(GLubytered,GLubytegreen,GLubyteblue)

voidglColor3ui(GLuintred,GLuintgreen,GLuintblue)

voidglColor3us(GLushortred,GLushortgreen,GLushortblue)

voidglColor4b(GLbytered,GLbytegreen,GLbyteblue,GLbytealpha)

voidglColor4d(GLdoublered,GLdoublegreen,GLdoubleblue,GLdoublealpha)

voidglColor4f(GLfloatred,GLfloatgreen,GLfloatblue,GLfloatalpha)

voidglColor4i(GLintred,GLintgreen,GLintblue,GLintalpha)

voidglColor4s(GLshortred,GLshortgreen,GLshortblue,GLshortalpha)

voidglColor4ub(GLubytered,GLubytegreen,GLubyteblue,GLubytealpha)

voidglColor4ui(GLuintred,GLuintgreen,GLuintblue,GLuintalpha)

voidglColor4us(GLushortred,GLushortgreen,GLushortblue,GLbytealpha)

參數(shù):red,green,blue指定當前新的紅、綠、藍的顏色值

alpha透明度,指明當前新的alpha顏色值,只有在glColor4函數(shù)中帶4個變量時才會指

定此參數(shù)。

此外還包括:

voidglColor3bv(constGLbyte*v)

voidglColor3dv(constGLdoble*v)

voidglColor3fv(constGLfloat*v)

voidglColor3iv(constGLint*v)

voidglColor3sv(constGLshort*v)

voidglColor3ubv(constGLubyte*v)

voidglColor3uiv(constGLuint*v)

voidglColor3usv(constGLushort*v)

voidglColor4bv(constGLbyte*v)

voidglColor4dv(constGLdoble*v)

voidglColor4fv(constGLfloat*v)

voidglColor4iv(constGLint*v)

voidglColor4sv(constGLshort*v)

voidglColor4ubv(constGLubyte*v)

voidglColor4uiv(constGLuint*v)

voidglColor4usv(constGLushort*v)

參數(shù):V指定一個值向包含紅、綠、藍和alpha值的數(shù)組指針。

三、glColorPointer

定義顏色數(shù)組

voidglColorPointer(GLintsize,GLenumtype,GLsizeistride,GLsizeicount,constGLvoid*

pointer)

參數(shù):size每個顏色的分量數(shù)目,該值必須是3或4

type在顏色數(shù)組中每個顏色分量的數(shù)據(jù)類型,可選的數(shù)據(jù)類型為:

GL_BYTEGL_UNSIGNED_BYTEGL_SHORTGL_UNSIGNED_SHORT

GL_INTGL_UNSIGNED_INTGL_FLOATGL_UNSIGNED_FLOAT

stride相鄰兩個顏色的字節(jié)偏移量。當stride為零時,顏色值在數(shù)組中是一個接一個排列的。

count靜態(tài)顏色的數(shù)目,從第一個顏色開始計數(shù)。

pointer指向顏色數(shù)組中第一個顏色元素中第一個分量的指針。

四、gllndex

設置當前顏色索引

voidglIndexd(GLdoublec)

voidglIndexf(GLfloatc)

voidglIndexi(GLintc)

voidglIndexs(GLshortc)

參數(shù):c新的當前顏色索引值

voidglIndexdv(GLdouble*c)

voidglIndexfv(GLfloat*c)

voidglIndexiv(GLint*c)

voidglIndexsv(GLshort*c)

參數(shù):c指向一個由單個元素組成的數(shù)組指針,該數(shù)組中包含新的當前顏色索引值。

五、gllndexPointer

定義顏色索引數(shù)組

voidglIndexPointer(GLenumtype,GLsizeistride,GLsizeicount,constGLvoid*pointer)

參數(shù):type數(shù)組中每個顏色索引的數(shù)據(jù)類型,可以選擇的符號常數(shù)為:GL_SHORTGL」NT

GL_FLOATGL_DOUBLE

stride相鄰的兩個顏色索引的字節(jié)偏移量。當stride為零時,顏色索引值在數(shù)組中是一個接

一個排列的。

count顏色索引的數(shù)目,從第一個顏色開始計數(shù),它們是靜態(tài)的。

pointer指向顏色數(shù)組中第一個顏色索引的指針。

六、glColorTableEXT

為目標調色板紋理指定調色板的格式和大小

voidglColorTableEXT(GLenumtarget,GLenuminternalFormat,GLsizeiwidth,GLenum

format,GLenumtype,constGLvoid*data)

參數(shù):target需要更改調色板的目標紋理,必須為TEXTURE」DTEXTURE_2D

PROXY_TEXTURE_1DPROXY_TEXTURE_2D

intenalFormat(等待編輯)

width調色板的大小,對于某些n,必須滿足2n>=l.

format(等待編輯)

typedata的數(shù)據(jù)類型,可選以下符號常量:

GL_UNSIGNED_BYTEGL_BYTEGL_UNSIGNED_SHORTGL_SHORT

GL_UNSIGNED_INTGL_INTGL_UNSIGNED_FLOATGL_FLOAT

data指向調色板紋理數(shù)據(jù)的指針。對于調色板項目,數(shù)據(jù)作為一維紋理調色板項目中的單

個像素進行處理。

七、glColorSubTableEXT

指定需要替代的目標紋理調色板的一部分

voidglColorSubTableEXT(GLenumtarget,GLsizeistart,GLsizeicount,GLenum

format,GLenumtype,constGLvoid*data)

參數(shù):target需要更改調色板的目標紋理,必須為TEXTURE」DTEXTURE_2D

PROXY_TEXTURE_1DPROXY_TEXTURE_2D

start被改變的調色板的起始調色板索引項目。

count被改變的調色板中從start開始的調色板索引項目的數(shù)目。count參數(shù)確定了被改變的

調色板中調色板索引項目的范圍。

format(等待編輯)

typedata的數(shù)據(jù)類型,可選以下符號常量:

GL_UNSIGNED_BYTEGL_BYTEGL_UNSIGNED_SHORTGL_SHORT

GL_UNSIGNED_INTGL_INTGL_UNSIGNED_FLOATGL_FLOAT

data指向調色板紋理數(shù)據(jù)的指針。對于調色板項目,數(shù)據(jù)作為一維紋理調色板項目中的單

個像素進行處理。

補充說明:

OpenGL在畫直線時,如果兩個頂點不一樣顏色,則自動進行插值計算,例如:

glBegin(GL_POLYGON);〃畫四邊形

glColor3f(1,0,0);

glVertex2f(-0.5,-0.5);

glColor3f(0,0,1.0);

glVertex2f(-0.5,0.5);

glColor3f(1,0,0);

glVertex2f(0.5,0.5);

glColor3f(0,0,1.0);

glVertex2f(0.5,-0.5);

glEnd();

獲得的圖形顏色為:

可以調用明暗模型函數(shù)來設置

VoidglShadeModel(GLenummode);

Mode值可為GL_SMOOTH(平滑模式)、GL_FLAT(平面模式)。

2.9.3、點(Point)

用浮點值表示的點稱為頂點(Vertex)。所有頂點在OpenGL內部計算時都使

用三維坐標(x,y,z)來處理,用二維坐標(x,y)定義的點在OpenGL中默認z值

為0。頂點坐標也可以用齊次坐標(x,y,z,w)來表示,如果w不為0.0,這些齊次

坐標表示的頂點即為三維空間點(x/w,y/w,z/w),一般來說,w缺省為1.0。

可以用glVertex{234}{sifd}[V](TYPEcords)函數(shù)來定義一個頂點。例如:

gIVertex2f(2.0f,30);〃二維坐標定義頂點;

OpenGL中定義的點可以有不同的尺寸,其函數(shù)形式為:

voidglPointSize(GLfloatsize);

注意:該函數(shù)不能放在gIBegin與glEnd之間。

參數(shù)size設置點的寬度(以象素為單位),必須大于0.0,缺省時為1.0。

2.9.4、線(Line)

在OpenGL中,線代表線段(LineSegment),它由一系列頂點順次連結而

成。具體的講,線有獨立線段、條帶、封閉條帶三種,如圖二所示:

短立線段(GL.LINES)條帶(GL-LINE.STRIP).

II---------72-

J^9XTY?n

引閔條帶(GL-LI'F.LOOP)

圖二、線段的三種連結方式

OpenGL能指定線的寬度并繪制不同的虛點線,如點線、虛線等。相應的函

數(shù)形式如下:

1、voidglLineWidth(GLfloatwidth);

設置線寬(以象素為單位)。參數(shù)width必須大于0.0,缺省時為1.0。

2、voidglLineStipple(GLintfactor,GLushortpattern);

設置當前線為虛點模式。參數(shù)pattern是一系列的16位二進制數(shù)(?;?),

它重復地賦給所指定的線,從低位開始,每一個二進制位代表一個象素,1表

示用當前顏色繪制一個象素(或比例因子指定的個數(shù)),0表示當前不繪制,只

移動一個象素位(或比例因子指定的個數(shù))。參數(shù)factor是個比例因子,它用來

拉伸pattern中的元素,即重復繪制1或移動0,比如,factor為2,則碰至1

時就連續(xù)繪制2次,碰到0時連續(xù)移動2個單元。factor的大小范圍限制在1到

255之間。

在繪制虛點線之前必須先啟動虛點模式,即調用函數(shù)

glEnable(GL_LINE_STIPPLE);結束時,調用glDisable(GL_LINE_STIPPLE)關

閉。下面代后2會制亍一個點線:

voidline2i(GLintx1,GLinty1,GLintx2,GLinty2)

glBegin(GL_LINES);

glVertex2f(x1,y1);

glVertex2f(x2,y2);

glEnd();

)

gILineStipple(1,0x1C47);/*虛點線7

glEnable(GL_LINE_STIPPLE);

glColor3f(0.0,1.0,0.0);

Iine2i(450,250,600,250);

說明:

OpenGL的許多專門特性必須啟動后才能使用,使用后需要關閉,啟動關閉函

數(shù)為:

voidglEnable(GLenumfeature)

voidglDisable(GLenumfeature)

2.9.5、多邊形(Polygon)

(-)凸、凹多邊形。

OpenGL定義的多邊形是由一系列線段依次連結而成的封閉區(qū)域,多邊形可

以是平面多邊形,即所有頂點在一個平面上,也可以是空間多邊形。OpenGL

規(guī)定多邊形中的線段不能交叉,區(qū)域內不能有空洞,也即多邊形必須是凸多邊形

(指多邊形任意非相鄰的兩點的連線位于多邊形的內部),不能是凹多邊形,否

則不能被OpenGL函數(shù)接受。凸多邊形和凹多邊形見圖三。

小多邊斗凹多邊形,

圖三、凸凹多邊形

(二)邊界標志問題。

實際應用中,往往需要繪制一些凹多邊形,通常解決的辦法是對它們進行分

割,用多個三角形來替代。顯然,繪制這些三角形時,有些邊不應該進行繪制,

否則,多邊形內部就會出現(xiàn)多余的線框。OpenGL提供的解決辦法是通過設置邊

標志命令glEdgeFlag()來控制某些邊產生繪制,而另外一些邊不產生繪制,

這也稱為邊界標志線或非邊界線。這個命令的定義如下;

voidglEdgeFlag(GLbooleanflag);

voidglEdgeFlag(PGLbooleanpflag);

(三)多邊形繪制模式。

多邊形的繪制模式包含有:全填充式、輪廓點式、輪廓線式、圖案填充式及

指定正反面等。下面分別介紹相應的OpenGL函數(shù)形式。

1)多邊形模式設置。其函數(shù)為:

voidglPolygonMode(GLenumface,GLenummode);

參數(shù)face為GL_FRONT、GL_BACK或GL_FRONT_AND_BACK;參數(shù)

mode為GL_POINT、GL_LINE或GL_FILL,分函表示繪前輪尾點式多邊形、

輪廓線式多質形或全填充會多邊形。在OpenGL中,多邊形分為正面和反面,

對這兩個面都可以進行操作,在缺省狀況下,OpenGL對多邊形正反面是以相同

的方式繪制的,要改變繪制狀態(tài),必須調用PolygonMode()函數(shù),

2)設置圖案填充式多邊形。其函數(shù)為:

voidglPolygonStipple(constGLubyte*mask);

參數(shù)mask是一個指向32x32位圖的指針。與虛點線繪制的道理一樣,某

位為1時繪制,為。時什么也不繪。注意,在調用這個函數(shù)前,必須先啟動

glEnable(GL_POLYGON_STIPPLE);不用時用

glDisable(GL_POLYGON_STIPPLE)關閉。下面舉出一個多邊形擴展繪制實例:

voidCALLBACKdi

溫馨提示

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

評論

0/150

提交評論