前面我们绘制了一个矩形, 现在就一并来看看如何绘制点、线以及多边形吧。
一、 点
在openGL里面有这样一系列的函数, 他们以glVertex开头, 没错, 这就是我们需要的绘制点的函数, 来看看有哪些:
WINGDIAPI void APIENTRY glVertex2d (GLdouble x, GLdouble y); WINGDIAPI void APIENTRY glVertex2dv (const GLdouble *v); WINGDIAPI void APIENTRY glVertex2f (GLfloat x, GLfloat y); WINGDIAPI void APIENTRY glVertex2fv (const GLfloat *v); WINGDIAPI void APIENTRY glVertex2i (GLint x, GLint y); WINGDIAPI void APIENTRY glVertex2iv (const GLint *v); WINGDIAPI void APIENTRY glVertex2s (GLshort x, GLshort y); WINGDIAPI void APIENTRY glVertex2sv (const GLshort *v); WINGDIAPI void APIENTRY glVertex3d (GLdouble x, GLdouble y, GLdouble z); WINGDIAPI void APIENTRY glVertex3dv (const GLdouble *v); WINGDIAPI void APIENTRY glVertex3f (GLfloat x, GLfloat y, GLfloat z); WINGDIAPI void APIENTRY glVertex3fv (const GLfloat *v); WINGDIAPI void APIENTRY glVertex3i (GLint x, GLint y, GLint z); WINGDIAPI void APIENTRY glVertex3iv (const GLint *v); WINGDIAPI void APIENTRY glVertex3s (GLshort x, GLshort y, GLshort z); WINGDIAPI void APIENTRY glVertex3sv (const GLshort *v); WINGDIAPI void APIENTRY glVertex4d (GLdouble x, GLdouble y, GLdouble z, GLdouble w); WINGDIAPI void APIENTRY glVertex4dv (const GLdouble *v); WINGDIAPI void APIENTRY glVertex4f (GLfloat x, GLfloat y, GLfloat z, GLfloat w); WINGDIAPI void APIENTRY glVertex4fv (const GLfloat *v); WINGDIAPI void APIENTRY glVertex4i (GLint x, GLint y, GLint z, GLint w); WINGDIAPI void APIENTRY glVertex4iv (const GLint *v); WINGDIAPI void APIENTRY glVertex4s (GLshort x, GLshort y, GLshort z, GLshort w); WINGDIAPI void APIENTRY glVertex4sv (const GLshort *v); WINGDIAPI void APIENTRY glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer); WINGDIAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
不看不知道,一看吓一跳, 光是绘制点就有这么多函数。 安啦, 我们仔细看一下就会明白: 后面跟的数字表示参数的个数, 字母表示参数的类型
s表示16位整数(GLshort)
i表示32位整数(GLint和GLsizei)
f表示32位浮点数(GLfloat和GLclampf)
d表示64位浮点数(GLdouble和GLclampd)
v表示传递的几个参数将使用指针的方式
虽然他们表现方式不同, 但是功能都是一样的, 就像下面几个, 效果都没差, 小伙伴们可以自己看看:
glVertex2i( 1, 1); glVertex2f( 1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 0.0f); GLfloat posArr[] = { 1.0f, 1.0f, 0.0f}; glVertex3fv( posArr);
说了这么多, 我们来看看该如何绘制一个点, 直接上代码:
void display() { glClear( GL_COLOR_BUFFER_BIT); glBegin(GL_POINTS); glVertex2f( 0.0f, 0.0f); glEnd(); glFinish(); }
将我们原来的display函数替换成现在这样, 运行, 是不是在屏幕的中间出现了一个白色的小亮点啊
心细的小伙伴们估计已经发现了, 我们在使用glVertex2f()的时候, 在他的前后使用了glBegin()和glEnd()包围了他。 解释一下这两个函数:
先看看原型:
WINGDIAPI void APIENTRY glBegin (GLenum mode); WINGDIAPI void APIENTRY glEnd (void);
看到glBegin()的参数是一个类型, 我们应该猜到了我们需要在这里设置我们的那些点到底是用来干什么用的。 我们虽然知道我们是要用来画点或者划线, 但是计算机不知道, 我们就必须得告诉他。 所以这些函数必须包含在glBegin()和glEnd()里面使用。当然, 在这两个函数里面, 我们还可以颜色, 法向量, 纹理坐标等, 这些到后面再说。
我们再来看看有哪些常用的类型:
GL_POINTS:把每一个顶点作为一个点进行处理,顶点n即定义了点n,共绘制N个点 GL_LINES:把每一个顶点作为一个独立的线段,顶点2n-1和2n之间共定义了n条线段,总共绘制N/2条线段 GL_LINE_STRIP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,总共绘制n-1条线段 GL_LINE_LOOP:绘制从第一个顶点到最后一个顶点依次相连的一组线段,然后最后一个顶点和第一个顶点相连,第n和n+1个顶点定义了线段n,总共绘制n条线段 GL_TRIANGLES:把每个顶点作为一个独立的三角形,顶点3n-2、3n-1和3n定义了第n个三角形,总共绘制N/3个三角形 GL_TRIANGLE_STRIP:绘制一组相连的三角形,对于奇数n,顶点n、n+1和n+2定义了第n个三角形;对于偶数n,顶点n+1、n和n+2定义了第n个三角形,总共绘制N-2个三角形 GL_TRIANGLE_FAN:绘制一组相连的三角形,三角形是由第一个顶点及其后给定的顶点确定,顶点1、n+1和n+2定义了第n个三角形,总共绘制N-2个三角形 GL_QUADS:绘制由四个顶点组成的一组单独的四边形。顶点4n-3、4n-2、4n-1和4n定义了第n个四边形。总共绘制N/4个四边形 GL_QUAD_STRIP:绘制一组相连的四边形。每个四边形是由一对顶点及其后给定的一对顶点共同确定的。顶点2n-1、2n、2n+2和2n+1定义了第n个四边形,总共绘制N/2-1个四边形 GL_POLYGON:绘制一个凸多边形。顶点1到n定义了这个多边形。
这是在网上找的一张图片, 还是比较直观的
二: 直线与多边形
额, 上面说来那样, 我都不知道该如何说这两个了, 直接贴代码和效果图算了, 偷个懒, 嘿嘿
直线:
void display() { glClear( GL_COLOR_BUFFER_BIT); glBegin( GL_LINES); glVertex2f( 0.0f, 0.0f); glVertex2f( -0.3f, 0.1f); glVertex2f( 0.1f, 0.3f); glVertex2f( 0.4f, 0.6f); glEnd(); glFinish(); }
多边形:
void display() { glClear( GL_COLOR_BUFFER_BIT); glBegin( GL_LINE_LOOP); glVertex2f( 0.0f, 0.0f); glVertex2f( -0.3f, 0.1f); glVertex2f( 0.1f, 0.3f); glVertex2f( 0.4f, 0.6f); glEnd(); glFinish(); }
其实吧, 这些不只是可以画出点、直线以及多边形, 几乎可以画出所有的几何图案, 比如说圆, 函数图像之类的都是可以的哟。
每天积累一点点, 总有一天你会成为大神的