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

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_RGB0x0000指定 RGB 颜色模式的窗口
GLUT_RGBA0x0000指定 RGBA 颜色模式的窗口
GLUT_INDEX0x0001指定颜色索引模式的窗口
GLUT_SINGLE0x0000指定单缓存窗口
GLUT_DOUBLE0x0002指定双缓存窗口
GLUT_ACCUM0x0004窗口使用累加缓存
GLUT_ALPHA0x0008窗口的颜色分量包含 alpha 值
GLUT_DEPTH0x0010窗口使用深度缓存
GLUT_STENCIL0x0020窗口使用模板缓存
GLUT_MULTISAMPLE0x0080指定支持多样本功能的窗口
GLUT_STEREO0x0100指定立体窗口
GLUT_LUMINANCE0x0200窗口使用亮度颜色模型

其中几种缓存方式介绍一下:
单缓冲,实际上就是将所有的绘图指令在窗口上执行,就是直接在窗口上绘图,这样的绘图效率是比较慢的,如果使用单缓冲,而电脑比较慢,你回到屏幕的闪烁。
双缓冲,实际上的绘图指令是在一个缓冲区完成,这里的绘图非常的快,在绘图指令完成之后,再通过交换指令把完成的图形立即显示在屏幕上,这就避免了出现绘图的不完整,同时效率很高。
颜色缓存(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
这里写图片描述
人在为了保护最重要的人的时候,会变得非常坚强。-白
不该下雪的季节却下雪了,白是你在哭泣吗?如果可以的话,真的很想和你去同一个地方。-桃地再不斩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值