圖元三種基本類型:點、直線段、多邊形。其他複雜的對象均是由這三種圖元來構建。
點
void glPointsize(GLfloat size) //對點尺寸狀態變量進行設定,單位爲像素,默認值1.0
注:glPointSize()不能放置在glBegin()和glEnd()函數之間。
直線
glBegin(mode) 繪製直線時,mode可取下列值:
GL_LINES:glBegin()和glEnd()函數之間每兩個連續頂點繪製一條線段。
GL_LINE_STRIP:首尾相接的線段。
GL_LINE_LOOP:首尾相接,且最後一個頂點與第一個頂點也相連接。
直線的屬性包括顏色、線寬、以及模式(創建虛線和點劃線)
void glLineWidth(GLfloat width) //設置線寬,默認1.0
void glLineStipple(GLint factor,GLushort pattern) //pattern是一個16位進制的數,從低 位開始讀取,若位數上位1,則繪製像素點,爲0則不繪製,factor是重複繪製的次數
啓用OpenGL特性
OpenGL有許多繪製功能,如光照、消隱、紋理映射等。每種特性都將影響繪製處理速度,因此很多特性默認都是禁用的,若需要使用則在開啓,不用則關閉。
void glEnable(GLenum feature)
void glDisable(GLenum feature)
//啓用或禁用OpenGL中某個特性
例如,在上例中若要繪製點劃線,必須先要開啓點劃模式glEnable(GL_LINE_STIPPLE)
注:使用某種特性之前不要忘記首先開啓該特性。否則即使設定相關參數也是徒勞的。
填充的圖元
具有內部區域的圖元在顯示時都可以以某種顏色或模式進行填充。glBegin()的參數可以爲下:
GL_POLYGON:繪製一個凸多邊形
GL_TRIANGLE:(P0,P1,P2),(P3,P4,P5),(P6,P7,P8),多餘的頂點將被忽略。
GL_TRIANGLE_STRIP:(P0,P1,P2),(P1,P2,P3),(P2,P3,P4).....
GL_TRIANGLE_FAN:(PO,P1,P2),(P0,P2,P3),(P0,P3,P4).......
GL_QUADS:(P0,P1,P2,P3),(P4,P5,P6,P7)..........
GL_QUAN_STRIP:(P0,P1,P2,P3),(P2,P3,P4,P5)..........
矩形:
void glRect<sidf>(type x1,type y1,type x2,type y2)
void glRect<sidf>v(type* v1,ytpe* v2)
多邊形的點劃模式:
glEnable(GL_POLYGON_STIPPLE)
void glPolygonStipple(const Glubyte * mask) mask爲32*32位
多邊形類型
OpenGL中,一個多邊形可以以三種不同的方式進行顯示:填充方式、邊線方式或與頂點對應的點集方式。而二維多邊形實際上具有兩個面:正面和背面。對於這些面,OpenGL可部分或全部繪製。
默認情況下,若沿着觀察方向看,多邊形的繞序爲逆時針方向,則該面爲正面,否則爲背面。
void glPolyMode(GLenum face,GLenum mode)
指定表面(GL_FRONT、GL_BACK、GL_FRONT_AND_BACK)如何進行繪製(GL_POINT、GL_LINE、 GL_FILL)。默認對正面和背面均進行填充。
我們也可以不對錶面中的某一個或全部進行繪製。
void glCullFace(GLenum mode)
在繪製時忽略(GL_FRONT、GL_BACK、GL_FRONT_AND_BACK)
void glFrontFace(GLenum mode)
逆時針(GL_CCW)或順時針(GL_CW)定義爲正面朝向
void glPolygonOffset(GLfloat factor,GLfloat units)
設置多邊形邊線的偏移量。偏移量可正可負,可爲任意模式的多邊形啓用。
glEnable(GL_POLYGON_OFFSET_LINE)
顏色插值
先看段代碼:
glBegin(GL_LINES); glColor3f(1.0,0.0,0.0); glvertex2f(1.0,1.0); glColor3f(0.0,0.0,1.0); glvertex2f(0.0,1.0); glEnd();
上述代碼中,兩個頂點被定義爲紅色和藍色。但是OpenGL將以何種顏色繪製這些頂點之間的點呢?
默認情況下,OpenGL將使用平滑着色,通過兩端的點進行插值。還有一種模式爲平面模式,以最後一個頂點的顏色進行着色。
void glShadeModel(GLenum mode)
將明暗模型設置爲平滑模式(GL_SMOOTH)或平面模式(GL_FLAT)。默認爲平滑模式。
離散處理與邊標記
若要生成非凸多邊形時,可以講非凸多邊形離散成多個三角形處理,若要填充顯示則沒什麼問題,但若只想邊顯示時,就會在非凸多邊形內部多繪製了幾條邊。解決辦法是藉助glEdgeFlag*()。若該標記設爲GL_TRUE。則每個頂點都被認爲是所想要顯示的線段的起點;若標記GL_FALSE,則構成虛假邊的頂點將不被顯示。
void glEdgeFlag(GLboolean flag)
void glEdgeFlagv(GLboolean* flag)
文本:
void glutBitmapCharacter(void* font,int char)
font指定字體繪製字符char,其中字符char由ASCII給出
例如:
glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10,'a') //得到Times-Romans的10磅位圖字符a
glutBitmapCharacter(GLUT_BITMAP_8_BY_13,'a') //8*13的字符a
字符出現的位置由光柵位置決定,這個位置決定了下一副位圖的左下角在屏幕的位置。
void glRasterPos<234><sidf>(x,y,z,w);
void glRasterPos<234><sidf>v(type* array);
繪製一個位圖後光柵自動會有一個偏移量,不會繪製到之前的位置上。
int glutBitmapWidth(void* font,int char)
返回由font指定的GLUT字體的字符char的像素寬度。
除了位圖字體外,還有筆畫字體
void glutStrokeCharacter(void* font,int char)
繪製字符char,筆畫字體由font指定
void glutStrokeWidth(void* font char)
返回char的位寬
查詢與錯誤
OpenGL狀態可通過一下幾個函數查詢
void glGetBooleanv(GLenum name,GLboolean* value)
void glGetIntegerv(GLenum name,GLboolean* value)
void glGetFloatv(GLenum name,GLboolean* value)
void glGetBDoublev(GLenum name,GLboolean* value)
void glGetPointerv(GLenum name,GLboolean* value)
GLboolean glIsEnabled(GLenum feature)
取決於feature,返回GL_TRUE或GL_FALSE。
GLenum glGetError()
返回自初始化或最近一次調用該函數起,最近發生的錯誤的類型。如果沒發生錯誤,則返回 GL_NO_ERROR
GLubyte* gluErrorString(GLenum error)
返回一個與glGerError()返回的錯誤對應的字符串信息
狀態的保存
矩陣棧堆用來保存投影矩陣和模型矩陣。
void glPushMatrix()
void glPopMatrix()
依據當前矩陣模式使矩陣入棧或出棧。
我麼也可以將多組屬性或全部屬性通過函數壓入棧中,繪圖時會臨時使用這些屬性,不用時出棧則 可恢復至之前的屬性
glPushAttrib(GLbitfield mask)
glPopAttrib()