且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《OpenGL编程指南》一1.3 OpenGL语法

更新时间:2022-10-08 10:42:50

本节书摘来自华章出版社《OpenGL编程指南》一书中的第1章,第1.3节,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区“华章计算机”公众号查看

1.3 OpenGL语法

正如你可能已经了解的,OpenGL库中所有的函数都会以字符“gl”作为前缀,然后是一个或者多个大写字母开头的词组,以此来命名一个完整的函数(例如glBindVertexArray())。OpenGL的所有函数都是这种格式。在上面的程序中你还看到了以“glut”开头的函数,它们来自第三方库OpenGL Utility Toolkit(GLUT),作者是Mark J. Kilgard。这是一个非常流行的跨平台工具库,可以用来显示窗口、管理用户输入,以及执行其他一些操作。我们所用的GLUT的版本叫做Freeglut,它的原作者是Pawel W. Olszta,其他贡献者还包括Andreas Umbach和Steve Baker(后者目前负责维护这个库)。Freeglut是原始的GLUT库的一个新变种。此外,你可能还会看到一个独立的函数glewInit(),它来自于Milan Ikits和Marcelo Magallon编写的第三方库OpenGL Extension Wrangler。附录A会进一步讲解这两个库的内容。
与函数命名约定类似,OpenGL库中定义的常量也是GL_COLOR_BUFFER_BIT的形式,如display()函数中所示。所有的常量都以GL_作为前缀,并且使用下划线来分隔单词。这些常量的定义是通过#define来完成的,它们基本上都可以在OpenGL的头文件glcorearb.h和glext.h中找到。
为了能够方便地在不同的操作系统之间移植OpenGL程序,OpenGL还为函数定义了不同的数据类型,例如GLfloat是浮点数类型,在例1.1中用它来声明vertices数组。此外,由于OpenGL是一个“C”语言形式的库,因此它不能使用函数的重载来处理不同类型的数据,此时它使用函数名称的细微变化来管理实现同一类功能的函数集。举例来说,我们将会在第2章遇到一个名为glUniform()的函数,它有多种变化形式,例如glUniform2f()和glUniform3fv()。在函数名称的“核心”部分之后,我们通过后缀的变化来提示函数应当传入的参数。例如,glUniform2f()中的“2”表示这个函数需要传入2个参数值(由于还可能会传入其他的参数,因此一共定义了24种不同的glUniform()函数—在本书中,我们使用glUniform()来统一表示所有glUniform*()函数的集合)。我们还要注意“2”之后的“f”。这个字符表示这两个参数都是GLfloat类型的。最后,有些类型的函数名称末尾会有一个“v”,它是vector的缩写,即表示我们需要用一个1维的GLfloat数组来传入2个浮点数值(对于glUniform2fv()而言),而不是两个独立的参数值。
表1-1所示为所有可以作为后缀的字母,以及它们所对应的数据类型。
表1-1 命令后缀与参数数据类型
《OpenGL编程指南》一1.3 OpenGL语法

 使用C语言的数据类型来直接表示OpenGL数据类型时,因为OpenGL自身的实现不同,可能会造成类型不匹配。如果直接在应用程序中使用OpenGL定义的数据类型,那么当需要在不同的OpenGL实现之间移植自己的代码时,就不会产生数据类型不匹配的问题了。