【OpenGL】 001 Open a window

在上一节中,我们用一个简单的程序调试了编程环境。从本节开始,对http://ogldev.atspace.co.uk/index.html网站上的教程进行学习翻译,欢迎批评指正。

【背景】

OpenGL规范没有指定为任何API来创建和操作窗口。现代的视窗系统,包括支持OpenGL的一个子系统,提供了一个OpenGL上下文和视窗系统之间的结合。在X窗口系统的接口称为GLX。微软提供的WGL在Windows和MacOS上都有CGL。直接使用这些接口来创建一个窗口来显示图形通常是繁重的工作,为什么我们使用高级别的图书馆,抽象了的细节。图书馆我们这里使用的是被称为OpenGL utility library,或GLUT。它提供了一个简化的API,以及事件处理,输入输出控制和一些其他服务。此外,GLUT是跨平台,使其更便携容易。其替代品包括SDL和GLFW的GLUT。

【函数简介】

glutInit(&argc, argv);
该函数被称为GLUT初始化。其参数可以从命令行以及诸如'-sync'和'-gldebug'等设置中直接得到,并且该设置无法使用异步性X和对GL自动检查错误并显示它们。

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
在这里,我们配置一些GLUT设置。GLUT_DOUBLE可以使用两层缓冲区(当一个缓冲区未显示时,绘制背景到另一个缓冲区),同时当大多数渲染结束时上色。

glutInitWindowSize(1024, 768); 
glutInitWindowPosition(100, 100); 
glutCreateWindow("Tutorial 01");
设置窗口的尺寸,位置,以及窗口的标题。

glutDisplayFunc(RenderSceneCB);
当我们在进行窗口系统操作的时候,大多数与运行程序的交互都是通过事件的回调函数完成的。GLUT侧重于与后台窗口系统的交互,并且提供给我们一些回调函数的设置选项。这里我们只用一个"main"回调来完成所有框架的渲染。该函数在GLUT内部循环中是连续不断工作的。

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
这是我们遇到的第一个OpenGL中对于状态的概念。渲染是一个复杂的任务,它不能被当做接受一些参数的函数调用(正确设计的函数从来不会接收大量的参数)。你需要指定阴影,缓冲区,各种标记,这些都会影响渲染。此外,你可能还希望在不同的渲染操作的时候保持一些特征。这就是为什么大多数渲染操作的特征都能通过OpenGL中设置标记和值来完成,同时渲染调用本身通常也是局限于一些在顶点数量附近循环的参数。在调用状态变化函数之后,特定的配置仍保持完整,直到下一次用不同的值调用相同函数时候。(大概意思就是缺省值……)上述函数的调用是设置颜色,当清除框架缓存区时使用。颜色有四个通道(RGBA),值从0.0到1.0

glutMainLoop();
该函数让GLUT开始其自己内部的循环。在该循环中,它服从于窗口系统以及我们配置的回调函数的事件。在我们的实例中,GLUT只会调用我们定义过的函数,比如显示回调(RenderSceneCB)给我们渲染框架。

glClear(GL_COLOR_BUFFER_BIT); 
glutSwapBuffers();
在我们的渲染函数中,我们唯一要做的就是清除框架缓存区(运用上述特定的颜色)。(第一个函数为清屏)

第二个函数是让GLUT交换前缓冲区和后缓冲区。在下一次渲染调用时,我们将前缓冲区渲染为当前框架,将后缓冲区隐藏。

【源代码】

#include <GL/glut.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;
}








你可能感兴趣的:(【OpenGL】 001 Open a window)