OpenGL是根据三维投影几何的齐次坐标进行操作的。因此,在内部的计算中,所有的顶点都是用4个浮点坐标值表示的(x, y, z和w)。如果w不等于0,那么这些坐标值就对应于欧几里德三维点(x/w, y/w, z/w)。虽然可以在OpenGL函数中指定w坐标,但是这种做法极为罕见。
在OpenGL中,所有的几何物体最终都描述成一组有序的顶点。glVertex*()函数用于指定顶点。
1. void glVertex[234]{sifd}(TYPE coords);
2. void glVertex[234]{sifd}v(const TYPE* coords);
指定了一个用于描述几何物体的顶点。可以选择这个函数的适当版本,既可以为一个顶点提供多达4个的坐标(x, y, z, w),也可以只提供2个坐标(x, y)。如果选择的函数版本并没有显式地指定z或w,z就会当作0,w则默认为1。glVertext*()函数只有当它位于glBegin()和glEnd()之间时才有效。 除非被编译到一个显示列表中,否则,所有的glVertex*()函数都应该出现在glBegin()和glEnd()之间。
void glBegin(GLenum mode);几何图元类型和说明
类型 | 说明 |
GL_POINTS | 单个顶点集 |
GL_LINES | 多组双顶点线段 |
GL_POLYGON | 单个简单填充凸多边形 |
GL_TRAINGLES | 多组独立填充三角形 |
GL_QUADS | 多组独立填充四边形 |
GL_LINE_STRIP | 不闭合折线 |
GL_LINE_LOOP | 闭合折线 |
GL_TRAINGLE_STRIP | 线型连续填充三角形串 |
GL_TRAINGLE_FAN | 扇形连续填充三角形串 |
GL_QUAD_STRIP | 连续填充四边形串 |
在glBegin()和glEnd()之间可调用的函数
// OpenGLDemo.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <GL/glut.h> #include <math.h> const int n = 1000; const GLfloat R = 0.5f; const GLfloat Pi = 3.1415926536f; const GLfloat factor = 0.1f; void myDisplay(void) { ///第一个程序----矩形 //glClear(GL_COLOR_BUFFER_BIT); //glRectf(-0.5f, -0.5f, 0.5f, 0.5f); //glFlush(); ///第二个程序----圆 //int i; //glClear(GL_COLOR_BUFFER_BIT); //glBegin(GL_POLYGON);//有顶点就必须要有glBegin() glEnd(); //for(i=0; i<n; ++i) // glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i)); //glEnd(); //glFlush(); ///第三个程序---五星 GLfloat a = 1 / (2-2*cos(72*Pi/180)); GLfloat bx = a * cos(18 * Pi/180); GLfloat by = a * sin(18 * Pi/180); GLfloat cy = -a * cos(18 * Pi/180); GLfloat PointA[2] = { 0, a }, PointB[2] = { bx, by }, PointC[2] = { 0.5, cy }, PointD[2] = { -0.5, cy }, PointE[2] = { -bx, by }; glClear(GL_COLOR_BUFFER_BIT); // 按照A->C->E->B->D->A的顺序,将五角星画出 glBegin(GL_LINE_LOOP);//闭合折线 glVertex2fv(PointA); glVertex2fv(PointC); glVertex2fv(PointE); glVertex2fv(PointB); glVertex2fv(PointD); glEnd(); glFlush(); ///第四个程序----画出正弦函数图形 //GLfloat x; //glClear(GL_COLOR_BUFFER_BIT); //glBegin(GL_LINES); //glVertex2f(-1.0f, 0.0f); //glVertex2f(1.0f, 0.0f); // 以上两个点可以画x轴 //glVertex2f(0.0f, -1.0f); //glVertex2f(0.0f, 1.0f); // 以上两个点可以画y轴 //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; }
为了打开或关闭这些状态,可以使用下面这两个简单的函数:
1. void glEnable(GLenum capability);
2. void glDisable(GLenum capability);
glEnable()启用一个功能,glDisable()用于关闭一个功能。程序员可以向glEnable()或glDisable()传递超过6 0 个的枚举值作为参数.
3. GLboolean glIsEnabled(GLenum capability) ;
根据被查询的状态当前处于启用还是禁用状态,它返回GL_TRUE或GL_FALSE。
可以使用的查询函数共有5个,可以查询许多状态的当前值:
1. void glGetBooleanv(GLenum pname, GLboolean *params);
2. void glGetIntegerv(GLenum pname, GLint *params);
3. void glGetFloatv(GLenum pname, GLfloat *params);
4. void glGetDoublev(GLenum pname, GLdouble *params);
5. void glGetPointerv(GLenum pname, GLvoid **params);
点的细节
glPointSize()函数,并在参数中提供一个值,表示所需要的点的大小(以像素为单位)。
1. void glPointSize(GLfloat size);
设置被渲染点的宽度,以像素为单位。size必须大于0.0,在默认情况下为1.0。
抗锯齿功能被禁用(默认情况)
在屏幕上所绘制的是对齐的正方形像素区域。因此,如果宽度值是1.0,这个方块的大小就是1个像素乘以1个像素;如果宽度为2.0,这个方块就是2个像素乘以2个像素.
启用了抗锯齿或多重采样
屏幕上所绘制的将是一个圆形的像素区域。一般情况下,位于边界的像素所使用的颜色强度较小,使边缘具有更平滑的外观。
glGetFloatv()函数查询点的信息:
GL_ALIASED_POINT_RANGE 未进行抗锯齿处理的情况下最小和最大的点。
GL_SMOOTH_POINT_SIZE_RANGE 进行了抗锯齿处理的情况下最小和最大的点。O p e n G L支持的非抗锯齿点的大小均匀地分布在最小和最大范围之间。
GL_SMOOTH_POINT_SIZE_GRANULARITY 支持的特定抗锯齿点大小的精度。例如,如果调用glPointSize(2.37),并且返回的粒度值为0.1,那么这个点的大小将四舍五入为2.4。