Tutorial 1:打开新世界的大门(Open a window)

背景

OpenGL 标准没有指定任何用于建立和操控窗口的 API。支持OpenGL的现代窗口系统包含了一种能够绑定OpenGL上下文跟窗口系统的子系统。在X系统中提供 OpenGL 的接口为 GLX。Windows 提供 了WGL 而 MacOS 提供 了CGL。直接使用这些接口来创建一个窗口来显示图形通常是繁重的工作,这就是为什么我们使用更高级别的,抽象了的细节的库.我们在这里使用的库叫 ‘OpenGL utility library’, 又名 GLUT。它为窗口管理、事件处理、IO 控制和一些其他的设备管理提供了一个简化的 API。此外,GLUT 是跨平台的,这使移植更方便。如今市面上主流的GLUT的替代品为SDL和GLFW。

代码详解

glutInit(&argc, argv); 

初始化GLUT。其的参数可以直接由命令行中提供,同时也可以包含其他有用的可选项比如 ‘-sync’ 和 ‘-gldebug’,前者禁用了X系统的异步性,后者开启自动的GL错误检查并且显示他们。

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); 

我们在这而配置了一些GLUT选项。GLUT_DOUBLE允许了双重缓冲(允许绘制背景缓冲的通知显示其他缓冲的内容),GLUT_RGBA设置了颜色缓冲,这是大多数渲染(比如屏幕渲染)的最后一步。我们将在后面的学习中经常看到这两个选项。

glutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Tutorial 01"); 

这些函数配置了窗口的参数并创建了一个窗口,你还可以为这个窗口指定一个可选的标题。

glutDisplayFunc(RenderSceneCB); 

由于我们工作在一个窗口系统中,我们必须通过事件回调函数与运行中的项目进行交互。GLUT关注底层的窗口系统交互并未我们提供了一些回调函数。我们在这儿只使用了其中一个回调函数,一个”主”回调函数,来完成一个窗体的所有渲染。这个函数被GLUT的内部循环不断的调用。

glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 

这是我们第一次在OpenGL接触”状态”(state)这个概念。提出”状态”的原因是:渲染是一个极其复杂的工作,你不能够简单的将它认为是一个只接受许多参数的函数命令(设计良好的函数不会有太多参数)。您需要指定着色器(shader)、缓冲(buffer)和各种影响渲染的标识。此外,你会经常想将一个相同的配置应用到不同的渲染当中(如果你从未禁用深度测试的功能,那就不用在每次渲染调用的时候去设置它)。这就是为什么大多数的渲染操作配置都是通过在Open状态机(state machine)设置标志位或者值来完成的,而渲染命令本身仅能局限于几个表示顶点数量以及初始偏移的参数。在调用一个状态改变函数之后(改变 OpenGL 的状态),这个状态将保持不变直到用不同的参数值再次调用此函数。上面这个函数是用来设置清除帧缓存(后面介绍)时要用到的颜色。颜色有四个通道(RGBA),而且它被指定为 0.0 – 1.0 之间标准化的值。

glutMainLoop(); 

这个函数调用将控制权传递给 GLUT,并且开启了GLUT内部的循环。在这个循环中,它监听来自窗口系统的事件并通过我们设置的回调函数传递给 GLUT。在本例子中,GLUT只调用我们定义用来显示窗口的回调函数(RenderSceneCB),以使我们能渲染帧。

glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers(); 

我们在渲染函数中唯一一件事就是清空窗口缓存(使用之前指定过的颜色–读者可以尝试着去修改它),第二个函数是为了使GLUT在backbuffer和frontbuff之间进行转换。在下一个回合中,我们将场景渲染到当前的 frontbuffer 中,而 backbuffer 将被显示。

源代码

#include <GL/freeglut.h>

static void RenderSceneCB()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glutSwapBuffers();
}

static void InitializeGlutCallbacks()
{
    glutDisplayFunc(RenderSceneCB);
}


int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
    glutInitWindowSize(1024, 768);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("Tutorial 01");

    InitializeGlutCallbacks();

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    glutMainLoop();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值