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);

 

posted on 2016-10-18 15:39  seapx  阅读(460)  评论(0)    收藏  举报

导航