【学习OpenGL】(一)——创建窗口的基本原理

第一个程序

#include <GL/glut.h>

// 绘制场景
void RenderSecene(void)
{
    // 用当前清除颜色清除窗口
    glClear(GL_COLOR_BUFFER_BIT);

    // 刷新绘图命令
    glFlush();
}

// 设置渲染状态
void SetupRC(void)
{
    glClearColor(0.0f,0.0f,1.0f,1.0f);
}

void main(void)
{
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutCreateWindow("Simple");
    glutDisplayFunc(RenderSecene);
    SetupRC();
    glutMainLoop();
}

运行结果:

这里写图片描述

作为第一个程序,Simple程序并没有完成太多的任务。当我们运行这个程序时,它会创建一个标准的GUI窗口,标题为Simple,并有一个蓝色的背景,如图所示。现在我们来逐行分析一下这个程序。

头文件

#include <GL/glut.h>

包含了glut.h头文件,这个程序所使用的的函数原型就在这个头文件中

显示模式

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

这个函数告诉OpenGL使用一个单缓冲窗口(GLUT_SINGLE),并使用RGB颜色模式(GLUT_RGB),单缓冲窗口意味着所有的绘图命令都是在显示窗口上执行的。就是直接在窗口上绘图,这样的绘图效率是比较慢的,如果使用单缓冲,而电脑比较慢,你会看到屏幕的闪烁。
另一种显示模式为双缓冲窗口,绘图命令实际上是在一个屏幕之外的缓冲区中执行的,这里的绘图非常的快,在绘图指令完成之后,再通过交换指令把完成的图形立即显示在屏幕上,这就避免了出现绘图的不完整,同时效率很高。

创建OpenGL窗口

glutCreateWindow("Simple");

调用GLUT函数在屏幕上创建一个实际的窗口,该函数的唯一参数就是窗口标题栏的标题。

显示回调

glutDisplayFunc(RenderSecene);

将先前定义的函数RenderScene设为回调函数,意味着只要需要绘制窗口,GLUT就会调用这里指定的函数,例如,在第一次显示窗口或改变窗口大小或移去窗口上覆盖的其他窗口时就会发生调用 。

设置渲染环境并继续

SetupRC();

这个函数将执行渲染之前应该完成的所有的OpenGL初始化工作。

glutMainLoop();

这个函数启动了GLUT框架的运行,该函数一经调用便不再返回,直到程序终止。因此,它在应用程序中只能调用一次,这个函数处理所有操作系统特定的消息,直到程序终止。

OpenGL图形调用

// 设置渲染状态
void SetupRC(void)
{
    glClearColor(0.0f,0.0f,1.0f,1.0f);
}

设定窗口内的背景色。
前三个参数为红绿蓝,每种成分的值范围从0.0~1.0。
最后一个参数为alpha成分,用于混合的特殊效果。
alpha通道是图像的不透明度参数。如果一个像素的alpha通道数值为0,那它就是完全透明的(也就是看不见的),而数值为1则意味着一个完全不透明的像素(传统的数字图像)。在0-1之间的值 则使得像素可以透过背景显示出来,就像透过玻璃(半透明性)看背景一样。

这里写图片描述

清除颜色缓冲区

glClear(GL_COLOR_BUFFER_BIT);

glClear函数用于清除一个特定的缓冲区或者同时清除几个缓冲区。缓冲区是用于保存图像信息的存储区域,一副图像的颜色通常一起储存在一个颜色缓冲区或像素缓冲区的地方。颜色缓冲区其实就是被显示图像的内部存储位置

刷新队列

glFlush();

OpenGL中的绘图命令在被调用时并不会立即生效,而是会被放入一个命令队列
glFlush的功能就是将命令队列中的命令都生效并清空队列,使所有未执行的OpenGL命令都被执行。
当设置了双缓冲时,glFlush就不再需要了。

最后:
这个程序虽然简单,也不是很有趣,但演示了使用GLUT函数库创建窗口的基本原理,并且说明了如何指定一种颜色和清除窗口。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值