零基础入门OpenGL系列教程(五、早期OpenGL点线面)

上一篇讲到简单的用OpenGL绘图,这次我们更深入的了解一下早期的OpenGL绘图方式。本篇内容讲述如何用OpenGL绘制图元。

绘图的基础是图元,而图元的基础就是一个一个的像素点。首先介绍一下点的画法,只要在void glBegin(GLenum mode)函数中传入GL_POINTS就行了。

void display()
{
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POINTS);
    glColor3f(1.0f, 1.0f, 1.0f);
    glVertex2f(0.0f, 0.0f);
    glEnd();
    glFlush();
}

这是我的回调函数,我将背景色设置成黑板色,在正中间画了一个白点。需要注意的是参数是GL_POINTS,而不是GL_POINT,无论你绘制多少点。

零基础入门OpenGL系列教程(五、早期OpenGL点线面)_第1张图片

直线

画直线也是和点一样的原理,只不过换了一个参数。

void display()
{
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_LINES);
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex2f(-0.3f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex2f(0.3f, 0.0f);
    glEnd();
    glFlush();
}
零基础入门OpenGL系列教程(五、早期OpenGL点线面)_第2张图片
线

这是画不相连的线段,还可以画相连的折线。

void display()
{
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_LINE_STRIP);
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex2f(-0.3f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex2f(0.3f, 0.0f);
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex2f(0.1f, 0.3f);
    glEnd();
    glFlush();
}
零基础入门OpenGL系列教程(五、早期OpenGL点线面)_第3张图片
折线

用同样的方法可以画闭合的折线段GL_LINE_LOOP

画面就是画各种多边形了,最一般的就是传多边形参数GL_POLYGON

void display()
{
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex2f(-0.3f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex2f(0.3f, 0.0f);
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex2f(0.1f, 0.3f);
    glColor3f(1.0f, 0.0f, 1.0f);
    glVertex2f(-0.5f, 0.2f);
    glEnd();
    glFlush();
}

随手画的多边形,看看效果。

零基础入门OpenGL系列教程(五、早期OpenGL点线面)_第4张图片
多边形

还可以制定多边形的种类,比如说三角形GL_TRIANGLES和四边形GL_QUADS

void display()
{
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_TRIANGLES);
    glColor3f(1.0f, 0.0f, 0.0f);
    glVertex2f(-0.3f, 0.0f);
    glColor3f(0.0f, 1.0f, 0.0f);
    glVertex2f(0.0f, 0.0f);
    glColor3f(0.0f, 0.0f, 1.0f);
    glVertex2f(-0.1f, 0.3f);
    glEnd();
    glBegin(GL_QUADS);
    glColor3f(1.0f, 0.0f, 1.0f);
    glVertex2f(0.5f, 0.2f);
    glColor3f(0.0f, 1.0f, 1.0f);
    glVertex2f(0.7f, 0.3f);
    glColor3f(1.0f, 1.0f, 0.0f);
    glVertex2f(0.5f, -0.3f);
    glColor3f(0.5f, 1.0f, 0.5f);
    glVertex2f(0.2f, -0.5f);
    glEnd();
    glFlush();
}

我把这两个图元画在了同一张画板上,看一下效果。

零基础入门OpenGL系列教程(五、早期OpenGL点线面)_第5张图片
三角形和四边形

利用OpenGLAPI和C语言相结合,可以画基础图元以外的图形,比如说圆。

void display()
{
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);
    GLint circle_points = 100;
    glBegin(GL_POLYGON);
    for (int i = 0; i < circle_points; i++) {
        GLfloat angle = 2*PI*i/circle_points;
        glColor3f(cos(angle), sin(angle), 0.5f);
        glVertex2f(cos(angle), sin(angle));
    }
    glEnd();
    glFlush();
}

效果图如下。


零基础入门OpenGL系列教程(五、早期OpenGL点线面)_第6张图片

这一篇主要讲了基础图元绘制,是基础中的基础,下一篇我想讲绘制属性等。其实我也想快速进入现代OpenGL部分,但是课堂上要求用GLUT不能跳过啊。。。

你可能感兴趣的:(零基础入门OpenGL系列教程(五、早期OpenGL点线面))