二维图形的绘制主要包含点、线及各种多边形的绘制,需要考虑图形的形状,边的特性及图形颜色的填充。
点的绘制
点是最基本的图元,调用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)为正面