图元三种基本类型:点、直线段、多边形。其他复杂的对象均是由这三种图元来构建。
点
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
void glRect
多边形的点划模式:
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>
void glRasterPos<234>
绘制一个位图后光栅自动会有一个偏移量,不会绘制到之前的位置上。
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()