本文共 1949 字,大约阅读时间需要 6 分钟。
在编写OpenGL程序之前,我们首先需要了解OpenGL是什么。OpenGL是一种应用程序接口(API),它定义了用于渲染3D图形的函数和数据结构。虽然不同的语言对OpenGL的实现可能有所不同,但它们都基于C语言的接口。
在C语言的API中,OpenGL定义了许多typedefs、#define和函数。这些定义了OpenGL中使用的基本数据类型,如GLint和GLfloat。复杂的数据结构,如struct,通常被隐藏在API背后,以便允许对非C语言的实现进行调整。
与直接在C++中定义结构体不同,OpenGL采用API方式实现对象管理。例如,创建一个对象并赋予其属性,可以通过以下步骤实现:
GLuint objectName;glGenObject(1, &objectName);glBindObject(GL_MODIFY, objectName);glObjectParameteri(GL_MODIFY, GL_OBJECT_COUNT, 5);glObjectParameteri(GL_MODIFY, GL_OBJECT_OPACITY, 0.4f);glObjectParameteri(GL_MODIFY, GL_OBJECT_NAME, "Some String");
需要注意的是,这些代码示例并不是实际的OpenGL命令,只是用来说明如何通过API创建和赋值对象。OpenGL自身管理所有对象的存储空间,因此用户只能通过引用(如GLuint)来访问对象。
OpenGL的API是一个状态机,几乎所有函数都用于设置或获取状态。这些状态共同构成了一个大型数据结构——OpenGL上下文(OpenGL_Context)。上下文中的每个属性都包含了渲染所需的信息。
通过绑定对象到上下文的目标位置,可以将对象的属性替换到上下文中。例如:
struct Values { int iValue1; int iValue2;};struct OpenGL_Context { Values *pMainValues; Values *pOtherValues;};OpenGL_Context context; 创建一个Values对象后,需要通过glGenValues函数生成并绑定到上下文的目标位置,如GL_MAIN_VALUES或GL_OTHER_VALUES。通过glBindValues函数将对象绑定到目标上,然后使用glValueParam函数设置对象的特定参数。
从技术角度看,OpenGL并不是一个API,而是一个规范。这个规范定义了初始化状态以及每个函数如何改变或获取状态。当调用渲染函数时,状态的组合决定了最终的渲染结果。
这个规范由OpenGL架构审查委员会( Khronos Group 的一部分)撰写,包括苹果、NVIDIA、AMD等公司。规范的主要目的是确保不同硬件实现的结果一致,而不是具体实现方式。
OpenGL已经有多个版本,且版本之间的代码通常是向后兼容的。从OpenGL 3.0开始,核心API逐步减少不必要的函数,并将规范分为核心和扩展部分。然而,大多数硬件实现仍然支持老接口,确保向后兼容。
转载地址:http://dfvuz.baihongyu.com/