【opengl】学习笔记1

近来课程需要,跟着learnopengl.com学习了opengl,在此将要点记录以下。

学习网站:learnopengl(英文)learnopengl(中文)

一、OpenGL是什么

        一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。

        OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(译注:这里开发者是指编写OpenGL库的人)。

        实际的OpenGL库的开发者通常是显卡的生产商。

        简言之,OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的

        所有版本的OpenGL规范文档都被公开的寄存在Khronos那里。例如OpenGL3.3规范文档

二、核心模式与立即渲染模式(Core-profile vs Immediate mode)

        早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发,这个分支的规范完全移除了旧的特性。

三、扩展

        OpenGL的一大特性就是对扩展(Extension)的支持,当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。

        通过这种方式,开发者不必等待一个新的OpenGL规范面世,就可以使用这些新的渲染特性了。

        通常,当一个扩展非常流行或者非常有用的时候,它将最终成为未来的OpenGL规范的一部分。

四、状态机

        OpenGL本质上是个大状态机

        关于状态机的解释:一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。

        状态设置函数(State-changing Function):这类函数将会改变上下文。

        状态使用函数(State-using Function):这类函数会根据当前OpenGL的状态执行一些操作。

        我们通常使用如下途径去更改OpenGL状态:

        ①设置选项(setting some options)

        ②操作缓冲(manipulating some buffers)

        最后,我们使用当前OpenGL上下文来渲染(render using the current context)。

五、对象

        OpenGL库是用C语言写的,同时也支持多种语言的派生,但其内核仍是一个C库。

        由于C的一些语言结构不易被翻译到其它的高级语言,因此OpenGL引入了一些抽象层。

        “对象(Object)”就是其中一个抽象概念。

        在OpenGL中一个对象是指一些选项的集合,它代表OpenGL状态(即OpenGL上下文)的一个子集。

        可以把对象看做一个C风格的结构体(Struct):



        当我们使用一个对象时,通常看起来像如下一样(把OpenGL上下文看作一个大的结构体):



使用OpenGL时常见的工作流

        使用OpenGL时常见的工作流:

        ①首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)

        ②然后我们将对象绑定至上下文的目标位置

            (例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET)

        ③接下来我们设置窗口的选项。设置的选项将被保存在objectId所引用的对象中

        ④最后我们将目标位置的对象id设回0,解绑这个对象

       因为之前设置的选项被保存在objectId所引用的对象中, 一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效

        使用对象的好处:

        我们可以定义多个对象,每个对象都可以是不同的设置。在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。

你可能感兴趣的:(【opengl】学习笔记1)