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 所引用的对象,一旦我们重新绑定该对象,这些设置就会生效
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值