第2章 OpenGL程序框架
OpenGL是一种开放的三维图形API,它独立于窗口系统和操作系统,能十分方便地在各平台间移植。通常,每种环境下都有一些“粘贴”到OpenGL上的扩展接口,提供窗口管理和用户交互功能。这种“粘贴”就是把OpenGL图形处理命令关联到一个特定平台上的图形窗口。通常,每种环境还提供了一些函数,用于设置缓冲区模式、颜色深度以及其他绘图功能。对于Windows平台,这种粘贴代码包含在一组被称作“Wiggle”的函数中,它们是对Windows API的一种补充,它们的前缀是wgl而不是gl。为了使书中的实例代码更贴近实际应用,本书所采用的OpenGL程序框架不使用GLUT函数库,而是充分利用Windows操作系统的特性搭建基于Windows应用程序的OpenGL程序框架。所以,本章会详细讲解这些Wiggle函数,帮助你理解一个Windows窗口必须具有哪些特征才能支持OpenGL的图形处理功能,并且理解一个高效、健壮的OpenGL窗口应该如何创建。
虽然本书会涉及一些Windows API编程(www.cppentry.com)知识,但本章会详细讲解将用到的Windows编程(www.cppentry.com)知识,所以你只需要对C/C++(www.cppentry.com)语言有基本了解就可以读懂这个程序框架。本章将先使用面向过程的Win32 SDK编程(www.cppentry.com)风格和C语言编写这个程序框架,然后在使用C++(www.cppentry.com)的面向对象风格包装这个框架。这样做除了是为了能使读者更好地理解框架实现,也是为了照顾那些只熟悉C语言的读者。但实际的开发中,使用C++(www.cppentry.com)的面向对象风格来建立程序框架将更方便一些。所以后续章节的所有实例都采用面向对象的框架实现。不了解C++(www.cppentry.com)的读者可以方便地将图形处理的相关代码移植到C风格框架上。
2.1 窗口渲染环境
GLUT函数库只提供一个窗口,并且使用OpenGL产生的图形只能始终在这个窗口中输出。但是,在实际的Windows应用程序中,它常常拥有多个窗口。事实上,就连对话框、控件、菜单等都是使用窗口实现的。那么,当执行渲染代码时,OpenGL如何知道该在哪个Windows窗口中进行图形绘制呢?在回答这个问题之前,让我们首先回顾一下在不使用OpenGL的情况下,我们是如何在窗口中进行绘图的,这将非常有助你理解后面的程序框架的实现。