LearnOpenGL 笔记 - 入门 01 OpenGL
Posted 芥末的无奈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LearnOpenGL 笔记 - 入门 01 OpenGL相关的知识,希望对你有一定的参考价值。
系列文章目录
文章目录
1. 前言
最近需要学习一些 OpenGL 的知识,以便更好的开展工作。此系列文章将纪录学习 OpenGL 过程中产生的笔记。
经过一番搜索,网上有非常多 OpenGL 的教程,最终决定按照 LearnOpenGL 教程进行学习,理由有:
- 它有配套的代码,并且代码更新活跃。
- 它有中文翻译。这一点可以提高学习的效率。
- 它几乎涵盖了 OpenGL 所有的知识点,是一个完整的教程。
LearnOpenGL 相关资源:
- 英文版:https://learnopengl.com/
- 中文版:https://learnopengl-cn.github.io/
- 代码仓库:https://github.com/JoeyDeVries/LearnOpenGL
废话不多说,开始第一部分的内容,关于 OpenGL 的介绍。
2. OpenGL
- OpenGL 本身不是一个 API,它是由 Khronos 组织指定并维护的规范
- OpenGL规范规定了每个函数的输入、输出。内部如何实现的,由开发者自己决定
- OpenGL 3.3 规范文档,想了解细节可以看规范文档
2.1 核心模式(Core-profile)与立即渲染模式(Immediate Mode)
- 早期 OpenGL 只有立即渲染模式,它容易使用和理解,大多数细节被掩藏,但缺少灵活性,效率太低
- 从 OpenGL 3.2 开始,规范文档开始废弃立即渲染模式,并鼓励使用核心模式
- 核心模式有更高的灵活性和效率,但也更难学习;它要求使用者真正理解 OpenGL 和图形编程
2.2 扩展
- OpenGL 一大特性是对扩展的支持。通过这种方式,开发者不必等待一个新的OpenGL规范面世。
- 使用扩展的代码大多如下:
if(GL_ARB_extension_name)
// 使用硬件支持的全新的现代特性
else
// 不支持此扩展: 用旧的方式去做
2.3 状态机
- OpenGL 自身是一个巨大的状态机(State Machine)。OpenGL 状态通常被称为 OpenGL Context(上下文)
- 我们通常通过设置选项、操作缓冲来改变 OpenGL 的状态,并使用当前的上下文来渲染
- OpenGL 函数中,有一些是状态设置函数,这部分函数会改变上下文;还有一部分是状态使用函数,这类函数根据当前状态来执行一些操作
- OpenGL 本质上是一个大的状态机,记住这一点能够让你理解它大部分特性
2.4 对象(Object)
- OpenGL 中,对象是指一些选项的集合,它表示 OpenGL 状态的一个子集。可以把对象看成是一个 C 语言中的结构体:
struct object_name
float option1;
int option2;
char[] name;
;
- 把 OpenGL Context 看成一个很大的结构体,当我们使用对象时,其实是对这个大结构体做了某些操作,伪代码看起来像这样:
// OpenGL的状态
struct OpenGL_Context
...
object* object_Window_Target;
...
;
static OpenGL_Context context;
void glGenObject(GLsizei n, GLuint * arrays)
arrays = new GLuint[n];
for(int i = 0; i < n; ++i)
GLuint id = generateObjectId();
createObjectWithId(id);
arrays[i] = id;
void glBindObject(GLenum target, GLuint index)
if(GL_WINDOW_TARGET == target)
context->object_Window_Target = getObject(index);
// ....
void glSetObjectOption(GLenum target, GLenum opt, GLuint value)
if(target == GL_WINDOW_TARGET)
setWindowOption(context->object_Window_Target, opt, value);
// ....
// 创建对象
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);
- OpengGL 常见工作流:
- 创建对象,使用 id 保持它的引用
- 将对象绑定至上下文的目标位置
- 设置该对象的属性
- 最后将该目标位置 id 设置回 0,解除对象的绑定
- 通过上述工作流操作后,设置的选项保存在 id 所引用的对象,一旦我们重新绑定该对象,这些设置就会生效
以上是关于LearnOpenGL 笔记 - 入门 01 OpenGL的主要内容,如果未能解决你的问题,请参考以下文章
LearnOpenGL - Android OpenGL ES 3.0 绘制三角形