openGL 3 在空间中绘图1
1.1 顶点
使用函数glVertex在空间指定一个点。
接受两个参数的表示二维空间,接受三个参数的表示三维空间,接受四个参数的最后一个参数表示的是缩放度,缺省值是1。
1.2 绘制图形
图元只是一组顶点的集合,他们构成屏幕上面需要绘制的形状。绘制图元的一种方式是使用glBegin命令告诉openGL然后开始对一组顶点进行解释,将其作为特定的图元。然后就可以调用glEnd命令阶数组成这个图元的顶点列表。
下面是一段利用画点的方法来画一个圆的程序:
#include <GL/glut.h> #include <cmath> GLfloat r = 0.5f; int n = 30.0f; GLfloat pi = 3.1415f; void myFunc() { glClearColor(0.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f); glBegin(GL_POINTS); for (int i = 0; i < n; i++) { glVertex2f(r*cos((2 * pi / n)*i), r*sin((2 * pi / n)*i)); } glEnd(); glFlush(); } int main() { glutCreateWindow(""); glutDisplayFunc(&myFunc); glutMainLoop(); return 0; }

1.3 设置点的大小
缺省的状态下绘制一个点,它的像素大小是1个像素。
使用函数glPointSize(GLfloat size)可以修改点的大小。这个函数接受一个参数,它指定了被绘制的点的近似直径(按照像素计算)。但是点的大小设置还是存在限制的,应该确保所设置的点的大小是可行的,可以使用下面的代码:
GLfloat sizes[2];
GLfloat step;
glGetFloatv(GL_POINT_SIZE_RANGE, sizes);
glGetFloatv(GL_POINT_SIZE_GRANULARITY, &step);
这里sizes数组中的两个元素将是glPointSize的最小有效值和最大有效值,step表示允许的点大小范围之内的最小步进值。
利用glPointSize()我改了一下刚刚的那个程序,有一个需要注意的是glPointSize()函数是需要在glBegin(GL_POINTS)之前使用的,在那begin之后使用的话是没法改变点的大小的?大概是的吧?

哈哈然后在我刚刚写完这一段我就看到书上面的一句话,初学者应该注意glPointSize函数应该在glBegin/glEnd语句之外进行调用。
glPointSize函数所指定的点的大小并不是按照像素计算的准确点的大小,而是一个包含了绘制这个点所使用的所有像素的圆的近似直径。
1.4 画直线,非闭合的折线段,以及闭合的线形
glBegin(GL_LINES);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(50.0f, 50.0f, 50.0f);
glEnd();
这里用两个顶点指定了一个图元。每两个指定的顶点用于绘制一条直线。要是指定的点的个数是奇数的话,最后一个点就会被忽略掉。
改一下之前的代码:
glBegin(GL_LINES);
for (int i = 0; i < n; i++) {
glVertex2f(0.0f, 0.0f);
glVertex2f(r*cos((2 * pi / n)*i), r*sin((2 * pi / n)*i));
}
glEnd();

1.5 线带和线环
当指定了GL_LINE_STRIP模式的时候,它会绘制一条经过所有这些顶点的连续的线。
glBegin(GL_LINE_STRIP); glVertex2f(0.0f, 0.0f); glVertex2f(0.5f, 0.5f); glVertex2f(0.0f, 1.0f); glEnd();

基于直线的另一个图元是GL_LINE_LOOP。这种图元和GL_LINE_STRIP十分相似,但是此时最后一个顶点和第一个顶点之间也会绘制一条直线。用来绘制闭合的线形。
glBegin(GL_LINE_LOOP); glVertex2f(0.0f, 0.0f); glVertex2f(0.5f, 0.5f); glVertex2f(0.0f, 1.0f); glEnd();

1.5 用直线构造近似的曲线
绘制近似曲线的一种更好的方法是使用GL_LINE_STRIP连接所有的点。当点之间的距离越来越近的时候,就可以看到平滑的曲线。
void myFunc() { glClearColor(0.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0f, 0.0f, 0.0f); glPointSize(1.0f); glBegin(GL_LINE_STRIP); for (int i = 0; i < n; i++) { glVertex2f(r*cos((2 * pi / n)*i), r*sin((2 * pi / n)*i)); i++; glVertex2f(r*cos((2 * pi / n)*i), r*sin((2 * pi / n)*i)); } glEnd(); glFlush(); }

1.6 设置直线的宽度
可以使用glLineWidth(GLfloat width);
获取直线宽度的有效范围和它们之间的最小间隔值:
GLfloat sizes[2];
GLfloat step;
glGetFloatv(GL_LINE_WIDTH_RANGE, sizes);
glGetFloatv(GL_LINE_WIDTH_GRANULARITY, &step);

浙公网安备 33010602011771号