opengl教程

来源:互联网 发布:全球变暖 知乎 编辑:程序博客网 时间:2024/06/05 11:19

说明:本文翻译自http://ogldev.atspace.co.uk/www/tutorial01/tutorial01.html

教程1:

打开一个窗口


背景

OpenGL规范没有指定任何API来创建和操作窗口。支持opengl的现代窗口系统包括一个子系统,

它提供OpenGL环境和窗口系统之间的绑定。在图形用户接口系统的接口称为GLX。微软为Windows提供了WGL,苹果系统有CGL。直接使用这些接口来创建显示图形的窗口通常是繁重的工作,这就是为什么我们使用一个抽象细节的高级库。这里我们使用的库称之为“opengl实用库”或者“GLUT”库。它为窗口管理以及事件处理、IO控制和其他一些服务提供了一个简化的API。此外,GLUT是跨平台的。可供GLUT选择的库包括SDL和GLFW。

源语句

glutInit(&argc, argv);

  这是glut初始化程序,括号中的参数可以直接从命令行和一些可用的选项提供,例如'

-sync'和'gldebug',-sync命令禁用了异步图形用户接口,‘gldebug’自动检查GL错误并分别显示他们。

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); 

 在这里我们配置了一些GLUT选项,GLUT_DOUBLE启用了双缓冲(在显示另一个缓冲区时绘制背景缓冲区),而颜色的缓冲的结果

会显示在屏幕上。我们通常会想要这两种,以及其他的选择,稍后我们会看到。

glutInitWindowSize(1024, 768);

glutInitWindowPosition(100, 100);
glutCreateWindow("Tutorial 01");
glutSwapBuffers(); 

这些命令指定了窗口的参数并创建它,你可可以选择指定窗口标题。

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);

在我们的渲染函数中我们唯一做的事情是清除帧缓存(使用上面指定的颜色试着改变它)。第二个函数是告诉GLUT交换后备缓冲区和前缓冲区的位置。在下一轮的渲染中,两个缓冲区的位置将会交换。