1.3 OpenGL语法
正如你可能已经了解的,OpenGL库中所有的函数都会以字符“gl”作为前缀,然后是一个或者多个大写字母开头的词组,以此来命名一个完整的函数(例如glBindVertexArray())。OpenGL的所有函数都是这种格式。在上面的程序中你还看到了以“glfw”开头的函数,它们来自第三方库GLFW,这是一个抽象化窗口管理和其他系统任务的开发库。与之类似,你也会看到某个名为gl3wInit()的函数,它来自于第三方库GL3W。附录A会进一步讲解这两个库的内容。
与函数命名约定类似,OpenGL库中定义的常量采用GL_COLOR的形式,如display()函数中所示。所有的常量都以GL_作为前缀,并且使用下划线来分隔单词。这些常量的定义是通过#def?ines来完成的,它们基本上都可以在OpenGL的头文件glcorearb.h和glext.h中找到。
为了能够方便地在不同的操作系统之间移植OpenGL程序,OpenGL还为函数定义了不同的数据类型,例如GLf?loat是浮点数类型,在例1.1中用它来声明vertices数组。此外,由于OpenGL是一个C语言形式的库,因此它不能使用函数的重载来处理不同类型的数据,此时它使用函数名称的细微变化来管理实现同一类功能的函数集。举例来说,我们会在第2章遇到一个名为glUniform()的函数,它有多种变化形式,例如glUniform2f()和glUniform3fv()。在函数名称的“核心”部分之后,我们通过后缀的变化来提示函数应当传入的参数。例如,glUniform2f()中的“2”表示这个函数需要传入2个参数值(由于还可能会传入其他的参数,因此一共定义了24种不同的glUniform()函数—在本书中,我们使用glUniform()来统一表示所有glUniform*()函数的集合)。我们还要注意“2”之后的“f”。这个字符表示这两个参数都是GLf?loat类型的。最后,有些类型的函数名称末尾会有一个“v”,它是vector的缩写,即表示我们需要用一个一维的GLf?loat数组来传入2个浮点数值(对于glUniform2fv()而言),而不是两个独立的参数值。
表1-1所示为所有可以作为后缀的字母,以及它们所对应的数据类型。
使用C语言的数据类型来直接表示OpenGL数据类型时,因为OpenGL自身的实现不同,可能会造成类型不匹配。如果直接在应用程序中使用OpenGL定义的数据类型,那么当需要在不同的OpenGL实现之间移植自己的代码时,就不会产生数据类型不匹配的问题了。