二維圖形的繪製主要包含點、線及各種多邊形的繪製,需要考慮圖形的形狀,邊的特性及圖形顏色的填充。
點的繪製
點是最基本的圖元,調用glBegin時參數爲GL_POINTS,尺寸可以通過glPointSize()來設定,默認尺寸爲1px
def display():
glClear(GL_COLOR_BUFFER_BIT)
glPointSize(8) # 放在glBegin外面
glBegin(GL_POINTS)
glColor3f(1.0, 1.0, 1.0)
glVertex2f(0, -0.5)
glColor3f(1.0, 0.0, 0.0)
glVertex2f(0, 0.5)
glColor3f(1.0, 1.0, 0.0)
glVertex2f(-0.5, 0)
glColor3f(0.0, 1.0, 0.0)
glVertex2f(0.5, 0)
glEnd()
glFlush()
線的繪製
在glbegin()和glEnd()之間可以定義多條直線,每兩個點構成一條直線
def display():
glClear(GL_COLOR_BUFFER_BIT)
glLineWidth(3) # 設置線寬
glBegin(GL_LINES)
glVertex2f(0, -0.5)
glVertex2f(0, 0.5)
glVertex2f(-0.5, 0)
glVertex2f(0.5, 0)
glEnd()
glFlush()
此外,我們也可以啓用OpenGL特性,如繪製虛線(點劃模式)
函數 glLineStipple(factor, patter)
定義了一個16位模式,若某一位爲1,則該像素被繪製,否則不繪製
函數 glEnable(feature)
爲啓用OpenGL特性,使用點劃模式前需啓用特性
對上面的代碼就行修改就可以得到虛線了
def display():
glClear(GL_COLOR_BUFFER_BIT)
glLineWidth(3)
glLineStipple(3, 0xcccc)
glEnable(GL_LINE_STIPPLE) # 允許開啓點劃模式
glBegin(GL_LINES)
glVertex2f(0, -0.5)
glVertex2f(0, 0.5)
glVertex2f(-0.5, 0)
glVertex2f(0.5, 0)
glEnd()
glFlush()
#cccc表示爲1100 1100 1100 1100,其中每一個1被連續繪製3次,0連續不被繪製,最後得到寬度爲3px,需西安每段長度爲3px的虛線:
多邊形的繪製
下面繪製一個四邊形,描繪出邊,可以先繪製四邊形並填充,在繪製一個無填充的四邊形,兩者疊加:
def square():
glLineWidth(3) # 放在glBegin外面
glBegin(GL_POLYGON)
glVertex2f(0.5, 0)
glVertex2f(0, 0.5)
glVertex2f(-0.5, 0)
glVertex2f(0, -0.5)
glEnd()
def display():
glClear(GL_COLOR_BUFFER_BIT)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
glColor3f(0.5, 0.8, 0.7)
square()
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
glColor3f(1.0, 1.0, 1.0)
square()
glFlush()
效果圖:
圖形填充:繪製面的時候可以設置填充
glPolygonMode(face, mode)
參數 | 描述 |
---|---|
face | 可以取GL_FRONT、GL_FRONT_AND_BACK,指定繪製的面 |
mode | 可以取GL_FILL、GL_LINE和GL_POINT表示如何繪製 |
點劃模式:也可以設置多邊形的點劃模式:
glPolygonStipple(5, #cccc)
glEnable(GL_POLYGON_STIPPLE)
設置方向:可以設置圖形的正面方向,默認以點的逆時針排序爲正面方向
glFrontFace(GL_CCW) # 以逆時針爲正面
glFrontFace(GL_CW) # 以順時針(clockwise)爲正面