LearnOpenGL(一)
Introduction about OpenGL
文章目录
一、OpenGL简介
OpenGl(Open Graphics Library)被认为三大图形API之一,是比较适合初学者的API。因为有优质的教程如LearnOpenGL.git.io。OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。目前OpenGL的大多数实现由显卡商家编写,所以如果我们在编程时出现问题,我们可以尝试更新一下显卡驱动。1.立即渲染模式(Immediate mode)和核心模式(Core-profile)
立即渲染模式确实容易使用便于理解,但是其许多库被隐藏,灵活性低,效率低下。OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发,这个分支的规范完全移除了旧的特性。使用核心模式就必须使用现代函数,现代函数要求使用者真正理解OpenGL和图形编程,它有一些难度,然而提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。2.扩展(Extension)
扩展是OpenGL的一大特性,当有新的优化出现时,通常以扩展的形式在驱动中实现。支持的扩展:比如说rtx的显卡支持ray tracing gtx不支持这一扩展。开发者不必等到OpenGL新的规范面世就可以使用最新的渲染特性。 使用扩展的代码if(GL_ARB_extension_name)
{
// 使用硬件支持的全新的现代特性
}
else
{
// 不支持此扩展: 用旧的方式去做
}
3.状态机(state machine)
OpenGL自身即状态机,一系列变量描述OpenGL此时如何运行。OpenGL的状态通常被成为称为OpenGL上下(context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。假设当我们想告诉OpenGL去画线段而不是三角形的时候,我们通过改变一些上下文变量来改变OpenGL状态,从而告诉OpenGL如何去绘图。一旦我们改变了OpenGL的状态为绘制线段,下一个绘制命令就会画出线段而不是三角形。 当使用OpenGL的时候,我们会遇到一些状态设置函数(State-changing Function),这类函数将会改变上下文。以及状态使用函数(State-using Function),这类函数会根据当前OpenGL的状态执行一些操作。只要你记住OpenGL本质上是个大状态机,就能更容易理解它的大部分特性。4.对象
在OpenGL中一个对象是指一些选项的集合,它代表OpenGL状态的一个子集。比如,我们可以用一个对象来代表绘图窗口的设置,之后我们就可以设置它的大小、支持的颜色位数等等。可以把对象看做一个C风格的结构体(Struct)struct object_name {
float option1;
int option2;
char[] name;
//这里使用的改为了自带类型
//使用OpenGL的类型的好处是保证了在各平台中每一种类型的大小都是统一的。
//你也可以使用其它的定宽类型(Fixed-width Type)来实现这一点。
};
使用对象的一个好处是在程序中,我们不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的设置。在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。比如说我们有一些作为3D模型数据(一栋房子或一个人物)的容器对象,在我们想绘制其中任何一个模型的时候,只需绑定一个包含对应模型数据的对象就可以了(当然,我们需要先创建并设置对象的选项)。拥有数个这样的对象允许我们指定多个模型,在想画其中任何一个的时候,直接将对应的对象绑定上去,便不需要再重复设置选项了。
// 创建对象
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 绑定对象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文对象设回默认
glBindObject(GL_WINDOW_TARGET, 0);