/******************************************************************************* 数学上的点,只有位置,没有大小。 一般情况下,OpenGL中的点将被画成单个的像素(像素的概念,请自己搜索之~),虽然它 可能足够小,但并不会是无穷小。同一像素上,OpenGL可以绘制许多坐标只有稍微不同的点, 但该像素的具体颜色将取决于OpenGL的实现。 数学上的直线没有宽度,但OpenGL的直线则是有宽度的。同时,OpenGL的直线必须是有限长 度,而不是像数学概念那样是无限的。 OpenGL规定,一个多边形必须是一个“凸多边形”(其定义为:多边形内任意两点所确定的 线段都在多边形内,由此也可以推导出,凸多边形不能是空心的)。多边形可以由其边的端 点(这里可称为顶点)来确定。(注意:如果使用的多边形不是凸多边形,则最后输出的效 果是未定义的——OpenGL为了效率,放宽了检查,这可能导致显示错误。要避免这个错误, 尽量使用三角形,因为三角形都是凸多边形) “点”是一切的基础。 如何指定一个点呢?OpenGL提供了一系列函数。它们都以glVertex开头,后面跟一个数字和 1~2个字母。例如: glVertex2d glVertex2f glVertex3f glVertex3fv 等等。 数字表示参数的个数,2表示有两个参数,3表示三个,4表示四个(我知道有点罗嗦~)。 字母表示参数的类型,s表示16位整数(OpenGL中将这个类型定义为GLshort), i表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei), f表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf), d表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。 v表示传递的几个参数将使用指针的方式,见下面的例子。 这些函数除了参数的类型和个数不同以外,功能是相同的。例如,以下五个代码段的功能是 等效的: (一)glVertex2i(1, 3); (二)glVertex2f(1.0f, 3.0f); (三)glVertex3f(1.0f, 3.0f, 0.0f); (四)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f); (五)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f}; glVertex3fv(VertexArr3); OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶 点将被忽略)。并由glBegin来指明如何使用这些点。 例如我写: glBegin(GL_POINTS); glVertex2f(0.0f, 0.0f); glVertex2f(0.5f, 0.0f); glEnd(); 则这两个点将分别被画出来。如果将GL_POINTS替换成GL_LINES,则两个点将被认为是直线 的两个端点,OpenGL将会画出一条直线。 我们还可以指定更多的顶点,然后画出更复杂的图形。 另一方面,glBegin支持的方式除了GL_POINTS和GL_LINES,还有GL_LINE_STRIP, GL_LINE_LOOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN等 glBegin(); 在这里填上你所希望的模式 在这里使用glVertex*系列函数 指定你所希望的顶点位置 glEnd(); ********************************************************************************/ #include <GL/glut.h> #include <math.h> #pragma comment(linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" ) const GLfloat factor = 0.1f; void myDisplay(void) { GLfloat x; glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glVertex2f(-1.0f, 0.0f); glVertex2f(1.0f, 0.0f); glVertex2f(0.0f, -1.0f); glVertex2f(0.0f, 1.0f); glEnd(); glBegin(GL_LINE_STRIP); for(x=-1.0f/factor; x<1.0f/factor; x+=0.01f) { glVertex2f(x*factor, sin(x)*factor); } glEnd(); glFlush(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(400, 400); glutCreateWindow("第一个OpenGL程序"); glutDisplayFunc(&myDisplay); glutMainLoop(); return 0; }