欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LearnOpenGL(一)

程序员文章站 2022-07-04 11:06:29
...

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);

总结

以上就是今天要讲的内容,本文仅仅简单介绍了OpenGL。

OpenGL规范文档

相关标签: OpenGL opengl