OpenGL(一)二維圖形的繪製:圖元、多邊形、顏色插值、文本、查詢與錯誤、狀態的保存

圖元三種基本類型:點、直線段、多邊形。其他複雜的對象均是由這三種圖元來構建。


   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()



  

    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章