OpenGL学习笔记(四):了解OpenGL、OpenGL的操作模式、特性和基本使用步骤

简介: OpenGL学习笔记(四):了解OpenGL、OpenGL的操作模式、特性和基本使用步骤

原博主博客地址:http://blog.csdn.net/qq21497936

本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78762733


《OpenGL学习笔记》系列博客目录地址:http://blog.csdn.net/qq21497936/article/category/7315532


OpenGL学习笔记():了解OpenGLOpenGL的操作模式、特性和基本使用步骤



前话

       OpenGL是一个图形API,并不是一个独立的平台,它需要一个编程语言来工作,在这里我们使用的是C++。

       将用到一些数学知识(线性代数、几何、三角学),会详细解说所有的必备的数学概念。

       教程主要使用Learnoepngl-cn,地址为: https://learnopengl-cn.github.io/intro,笔记将会写一部分笔者总结和摘抄一些教程关键部分总结,并对代码进行详的注释,并添加笔者从其他途径获取的一些补充资料,尽量让笔记浅显易懂并记录相关关键信息。

概念

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

       OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(译注:这里开发者是指编写OpenGL库的人)。因为OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配(亦即,作为用户不会感受到功能上的差异)。

       实际的OpenGL库的开发者通常是显卡的生产商。你购买的显卡所支持的OpenGL版本都为这个系列的显卡专门开发的。当你使用Apple系统的时候,OpenGL库是由Apple自身维护的。在Linux下,有显卡生产商提供的OpenGL库,也有一些爱好者改编的版本。这也意味着任何时候OpenGL库表现的行为与规范规定的不一致时,基本都是库的开发者留下的bug

核心模式与立即渲染模式

       早期的OpenGL使用立即渲染模式(Immediatemode,也就是固定渲染管线),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少能控制OpenGL如何进行计算的自由。立即渲染模式确实容易使用和理解,但是效率太低。

       从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发,这个分支的规范完全移除了旧的特性。当使用OpenGL的核心模式时,OpenGL迫使我们使用现代的函数。当我们试图使用一个已废弃的函数时,OpenGL会抛出一个错误并终止绘图。现代函数的优势是更高的灵活性和效率,然而也更难于学习。

       立即渲染模式从OpenGL实际运作中抽象掉了很多细节,因此它在易于学习的同时,也很难让人去把握OpenGL具体是如何运作的。

       现代函数要求使用者真正理解OpenGL和图形编程,它有一些难度,然而提供了更多的灵活性,更高的效率,更重要的是可以更深入的理解图形编程。

       当使用新版本的OpenGL特性时,只有新一代的显卡能够支持你的应用程序。这也是为什么大多数开发者基于较低版本的OpenGL编写程序,并只提供选项启用新版本的特性。

特性

拓展

       当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。如果一个程序在支持这个扩展的显卡上运行,开发者可以使用这个扩展提供的一些更先进更有效的图形功能。通过这种方式,开发者不必等待一个新的OpenGL规范面世,就可以使用这些新的渲染特性了,只需要简单地检查一下显卡是否支持此扩展。通常,当一个扩展非常流行或者非常有用的时候,它将最终成为未来的OpenGL规范的一部分。使用扩展的代码大多看上去如下:

if(GL_ARB_extension_name) 
{
// 使用硬件支持的全新的现代特性 
} else
{
 // 不支持此扩展: 用旧的方式去做 
}

状态机

       OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。

       当使用OpenGL的时候,我们会遇到一些状态设置函数(State-changingFunction),这类函数将会改变上下文。以及状态使用函数(State-usingFunction),这类函数会根据当前OpenGL的状态执行一些操作。只要记住OpenGL本质上是个大状态机,就能更容易理解它的大部分特性。

对象

       OpenGL库是用C语言写的,同时也支持多种语言的派生,但其内核仍是一个C库。由于C的一些语言结构不易被翻译到其它的高级语言,因此OpenGL开发的时候引入了一些抽象层。“对象(Object)”就是其中一个。

       在OpenGL中一个对象是指一些选项的集合,它代表OpenGL状态的一个子集。比如,我们可以用一个对象来代表绘图窗口的设置,之后我们就可以设置它的大小、支持的颜色位数等等。可以把对象看做一个C风格的结构体(Struct):

struct object_name 
{ 
GLgloat option1; 
GLint option2; 
GLbyte[] name; 
};

       使用OpenGL的类型的好处是保证了在各平台中每一种类型的大小都是统一的。

      图片.png

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

// OpenGL的状态 
struct OpenGL_Context 
{ 
... 
object* object_Window_Target; 
... 
};

绑定过程

// 步骤一:创建对象 
unsigned int objectId = 0; 
// 步骤二:用一个id保存它的引用
glGenObject(1, &objectId); 
// 步骤三:绑定对象至上下文的目标位置
glBindObject(GL_WINDOW_TARGET, objectId); 
// 步骤四:设置窗口选项 
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 步骤五:将目标位置的对象id设回0,解绑这个对象
glBindObject(GL_WINDOW_TARGET, 0);

       这一小段代码展现了使用OpenGL时常见的工作流。

  • 步骤一:首先创建一个对象。
  • 步骤二:用一个id保存它的引用(实际数据被储存在后台)。
  • 步骤三:将对象绑定至上下文的目标位置。(例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET)。
  • 步骤四:设置窗口的选项。
  • 步骤五:将目标位置的对象id设回0,解绑这个对象。

       注意:设置的选项将被保存在objectId所引用的对象中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。

       使用对象的好处:我们可以定义多个对象,并分别设置它们,执行一个状态时,可绑定需要的对象,当状态改变需要绘制一个或多个模型时,只需要将其绑定到目标状态中即可,不要在重复设置选项了。

 

原博主博客地址: http://blog.csdn.net/qq21497936

本文章博客地址: http://blog.csdn.net/qq21497936/article/details/78762733


相关文章
|
9月前
QT+OpenGL鼠标操作和模型控制
光线追踪法 从鼠标投射 3D 射线, 通过摄像机,进入场景,然后检查该光线是否与某个对象相交。
131 0
OpenGL线框模式
OpenGL线框模式
95 0
|
缓存 索引
OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结
OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结
OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结
|
存储 缓存 C++
OpenGL学习笔记(十二):纹理的使用
OpenGL学习笔记(十二):纹理的使用
OpenGL学习笔记(十二):纹理的使用
|
编译器 C语言 C++
OpenGL学习笔记(十一):封装自己的着色器类
OpenGL学习笔记(十一):封装自己的着色器类
OpenGL学习笔记(十一):封装自己的着色器类
|
小程序 编译器 C语言
OpenGL学习笔记(十):深入学习和理解着色器
OpenGL学习笔记(十):深入学习和理解着色器
OpenGL学习笔记(十):深入学习和理解着色器
|
缓存 索引
OpenGL学习笔记(九):索引缓冲器(EBO /IBE)的理解与使用,引入线框/填充模式
OpenGL学习笔记(九):索引缓冲器(EBO /IBE)的理解与使用,引入线框/填充模式
OpenGL学习笔记(九):索引缓冲器(EBO /IBE)的理解与使用,引入线框/填充模式
|
存储 索引
OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形 下
OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形 下
|
存储 C语言 C++
OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形 上
OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形
OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形 上
|
IDE 开发工具 C语言
OpenGL学习笔记(七):创建第一个Qt5.9.3 OpenGL工程模版(与平台无关)
OpenGL学习笔记(七):创建第一个Qt5.9.3 OpenGL工程模版(与平台无关)
OpenGL学习笔记(七):创建第一个Qt5.9.3 OpenGL工程模版(与平台无关)