LearnOpenGL 笔记 - 入门 01 OpenGL

Posted 芥末的无奈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LearnOpenGL 笔记 - 入门 01 OpenGL相关的知识,希望对你有一定的参考价值。

系列文章目录


文章目录


1. 前言

最近需要学习一些 OpenGL 的知识,以便更好的开展工作。此系列文章将纪录学习 OpenGL 过程中产生的笔记。

经过一番搜索,网上有非常多 OpenGL 的教程,最终决定按照 LearnOpenGL 教程进行学习,理由有:

  1. 它有配套的代码,并且代码更新活跃。
  2. 它有中文翻译。这一点可以提高学习的效率。
  3. 它几乎涵盖了 OpenGL 所有的知识点,是一个完整的教程。

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 常见工作流:
    1. 创建对象,使用 id 保持它的引用
    2. 将对象绑定至上下文的目标位置
    3. 设置该对象的属性
    4. 最后将该目标位置 id 设置回 0,解除对象的绑定
  • 通过上述工作流操作后,设置的选项保存在 id 所引用的对象,一旦我们重新绑定该对象,这些设置就会生效

以上是关于LearnOpenGL 笔记 - 入门 01 OpenGL的主要内容,如果未能解决你的问题,请参考以下文章

LearnOpenGL 笔记 - 入门 04 你好,三角形

LearnOpenGL 笔记 - 入门 03 你好,窗口

LearnOpenGL - Android OpenGL ES 3.0 绘制三角形

OpenGL - 如何理解 VAO 与 VBO 之间的关系

LearnOpenGL学习笔记——可用GitHub下载本项目啦~

learnopengl“入门”的全部代码