OPENGL学习笔记(一)画一只dinosaur

简介: OpenGL这个库好,比起之前用过的opencv,cuda等开放库,opengl才几兆,不用安装,而且相对于VTK来说,OpenGL封装好的函数较为底层,灵活度较高,也可以更好地体现自己编写的算法的好坏。 OpenGL写程序先要OpenGL的头文件,lib,.dll相关配置可以在网上找到,这里不再累述。 对一个像我一样的初学者来书目前认为的OpenGL画图主要有三步:

OpenGL这个库好,比起之前用过的opencv,cuda等开放库,opengl才几兆,不用安装,而且相对于VTK来说,OpenGL封装好的函数较为底层,灵活度较高,也可以更好地体现自己编写的算法的好坏。
OpenGL写程序先要OpenGL的头文件,lib,.dll相关配置可以在网上找到,这里不再累述。
对一个像我一样的初学者来书目前认为的OpenGL画图主要有三步:
(1)先要产生一个画图的窗口,以及对窗口的相关配置;
(2)要在窗口中产生一张画布(对于2D的图画来说),并对画布进行一定的配置,如背景,画布的大小,观察的角度等;
(3)要编写画笔移动的轨迹,这是画出来画好坏的关键,这里数学好重要
先上一段程序来对照程序进行分析:

#include<stdio.h>
#include<gl\glut.h>
#include<math.h>
#include<stdlib.h>
#include<fstream>
#include<string>
using namespace std;
void myInit(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glColor3f(0.0f, 0.0f, 0.0f);
    glPointSize(4.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 640, 0, 480);
}
void drawdinosaur(void)
{
    string fileName;
    fileName = "dino.dat";
    fstream inStream;
    inStream.open(fileName, ios::in);
    if (inStream.fail())
        return;
    glClear(GL_COLOR_BUFFER_BIT);
    GLint numpolys, numlines, x, y;
    inStream >> numpolys;
    for (int j = 0; j < numpolys; j++)
    {
        inStream >> numlines;
        glBegin(GL_TRIANGLE_STRIP);
        for (int i = 0; i < numlines; i++)
        {
            inStream >> x >> y;
            glVertex2i(x, y);
        }
        glEnd();
    }
    glFlush();
    inStream.close();
}
void main()
{
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(100, 150);
    glutCreateWindow("OpenGL");
    glutDisplayFunc(drawdinosaur);
    myInit();
    glutMainLoop();
}

先是对显示窗口的设置

    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(100, 150);
    glutCreateWindow("OpenGL");
    glutDisplayFunc(drawdinosaur);

glutInitDisplayMode()创建窗口
其中有多种方式可以选择:

对应宏定义 意义
GLUT_RGB 0x0000 指定 RGB 颜色模式的窗口
GLUT_RGBA 0x0000 指定 RGBA 颜色模式的窗口
GLUT_INDEX 0x0001 指定颜色索引模式的窗口
GLUT_SINGLE 0x0000 指定单缓存窗口
GLUT_DOUBLE 0x0002 指定双缓存窗口
GLUT_ACCUM 0x0004 窗口使用累加缓存
GLUT_ALPHA 0x0008 窗口的颜色分量包含 alpha 值
GLUT_DEPTH 0x0010 窗口使用深度缓存
GLUT_STENCIL 0x0020 窗口使用模板缓存
GLUT_MULTISAMPLE 0x0080 指定支持多样本功能的窗口
GLUT_STEREO 0x0100 指定立体窗口
GLUT_LUMINANCE 0x0200 窗口使用亮度颜色模型

其中几种缓存方式介绍一下:
单缓冲,实际上就是将所有的绘图指令在窗口上执行,就是直接在窗口上绘图,这样的绘图效率是比较慢的,如果使用单缓冲,而电脑比较慢,你回到屏幕的闪烁。
双缓冲,实际上的绘图指令是在一个缓冲区完成,这里的绘图非常的快,在绘图指令完成之后,再通过交换指令把完成的图形立即显示在屏幕上,这就避免了出现绘图的不完整,同时效率很高。
颜色缓存(Color Buffer)
包含每个象素的颜色信息。颜色信息可以是颜色索引值(在颜色索引方式下),也可以是颜色的红、绿、蓝3个分量(在RGBA方式下),还可以存放表示物体透明程度的Alpha值。
深度缓存(Depth Buffer)
包含每个象素的深度值。深度值与z坐标有关,描述物体上某点距离观察点的远近,也可以称它为Z缓存(Z Buffer) 。
模板缓存(Stencil Buffer)
包含物体的模板值。模板值具有屏蔽作用,用于控制绘制的区域,使屏幕上某些区域可画,某些区域不可画。
累积缓存(Accumulation Buffer)
包含颜色信息。其可以合成一系列的绘制结果,实现某些特殊效果。

来自http://blog.csdn.net/zmy3376365/article/details/7575284

设下几个为设置窗口大小,名字,位置
glutDisplayFunc(drawdinosaur);为执行画图函数
接着对画布进行初始化:

void myInit(void)
{
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glColor3f(0.0f, 0.0f, 0.0f);
    glPointSize(4.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 640, 0, 480);
}

glClearColor(R,G,B,A):设置颜色缓存的清除值,其中RBG为设置擦除后RGB的颜色,A为透明度;
glColor3f(0,0,0):设置画笔的颜色;
glPointSize()为设置栅格化点的大小;
glMatrixMode()为选择什么矩阵为操作矩阵(这有点像CAD)
可选的值:
GL_MODELVIEW,对模型视景矩阵堆栈应用随后的矩阵操作.
GL_PROJECTION,对投影矩阵应用随后的矩阵操作.
GL_TEXTURE,对纹理矩阵堆栈应用随后的矩阵操作.
glLoadIdentity();重置当前指定的矩阵为单位矩阵.
gluOrtho2D();将画布投影到窗口

为画恐龙的函数

void drawdinosaur(void)
{
    string fileName;
    fileName = "dino.dat";
    fstream inStream;
    inStream.open(fileName, ios::in);
    if (inStream.fail())
        return;
    glClear(GL_COLOR_BUFFER_BIT);
    GLint numpolys, numlines, x, y;
    inStream >> numpolys;
    for (int j = 0; j < numpolys; j++)
    {
        inStream >> numlines;
        glBegin(GL_TRIANGLE_STRIP);
        for (int i = 0; i < numlines; i++)
        {
            inStream >> x >> y;
            glVertex2i(x, y);
        }
        glEnd();
    }
    glFlush();
    inStream.close();
}

主要功能为读取dino.dat文件中点的数目,坐标信息,画在画布上;
inStream >>为读取文件中坐标
其中部分点集为:

21
29
32 435
10 439
4 438
2 433
4 428
6 425
10 420
15 416
21 413
30 408
42 406
47 403
56 398
63 391
71 383
79 369
84 356
87 337
89 316
88 302
86 294
83 278
79 256
78 235
79 220
85 204
94 190
98 183
98 182
9
116 189

可以看到这只恐龙由21个点集,第一个点集为29个点,剩下为坐标
画点的方式为先读取点集的个数
glBegin(GL_TRIANGLE_STRIP);开始画点
for (int i = 0; i < numlines; i++)
{
inStream >> x >> y;
glVertex2i(x, y);
}
为根据x,y描点
glEnd();为一个点集画完,
下一个循环重复这一操作,
glFlush();为展示画的图像
最后的结果为:
这里写图片描述
nice
这里写图片描述
人在为了保护最重要的人的时候,会变得非常坚强。-白
不该下雪的季节却下雪了,白是你在哭泣吗?如果可以的话,真的很想和你去同一个地方。-桃地再不斩

目录
相关文章
|
缓存 索引
OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结
OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结
OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结
|
存储 缓存 C++
OpenGL学习笔记(十二):纹理的使用
OpenGL学习笔记(十二):纹理的使用
OpenGL学习笔记(十二):纹理的使用
|
编译器 C语言 C++
OpenGL学习笔记(十一):封装自己的着色器类
OpenGL学习笔记(十一):封装自己的着色器类
OpenGL学习笔记(十一):封装自己的着色器类
|
小程序 编译器 C语言
OpenGL学习笔记(十):深入学习和理解着色器
OpenGL学习笔记(十):深入学习和理解着色器
OpenGL学习笔记(十):深入学习和理解着色器
|
缓存 索引
OpenGL学习笔记(九):索引缓冲器(EBO /IBE)的理解与使用,引入线框/填充模式
OpenGL学习笔记(九):索引缓冲器(EBO /IBE)的理解与使用,引入线框/填充模式
OpenGL学习笔记(九):索引缓冲器(EBO /IBE)的理解与使用,引入线框/填充模式
|
存储 索引
OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形 下
OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形 下
|
存储 C语言 C++
OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形 上
OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形 上
|
IDE 开发工具 C语言
OpenGL学习笔记(七):创建第一个Qt5.9.3 OpenGL工程模版(与平台无关)
OpenGL学习笔记(七):创建第一个Qt5.9.3 OpenGL工程模版(与平台无关)
OpenGL学习笔记(七):创建第一个Qt5.9.3 OpenGL工程模版(与平台无关)
|
IDE 编译器 开发工具
OpenGL学习笔记(六):创建第一个VS2015 OpenGL工程模板(与平台无关)
OpenGL学习笔记(六):创建第一个VS2015 OpenGL工程模板(与平台无关)
OpenGL学习笔记(六):创建第一个VS2015 OpenGL工程模板(与平台无关)
|
IDE Linux 开发工具
OpenGL学习笔记(五):创建OpenGL工程模板前的所有准备工作
OpenGL学习笔记(五):创建OpenGL工程模板前的所有准备工作
OpenGL学习笔记(五):创建OpenGL工程模板前的所有准备工作