了解 OpenGL:基本概念和环境准备

909 阅读3分钟

OpenGL

有学习 OpenGL 的想法之后,首先是明确 OpenGL 的内容。之前做毕设的时候有过一些接触,OpenGL 可以用来绘制 STL 3D 模型,也就是 OpenGL 可以用来做比较「复杂」的绘制。

OpenGL 是什么

OpenGL 具有绘制的用途,但并不是一个 Library 或者 SDK 之类的具体实现,从定义上看,OpenGL 是一个「规范」,只提供了一些关于绘制的约定,即每个函数提供什么功能、接受哪些参数、输出什么内容等。

有了规范还需要有人按照规范实现功能,OpenGL 规范的具体实现就是一系列真实的函数了。从学习的角度看,学习 OpenGL 是要学习规范以及使用具体的函数。

为什么使用 OpenGL

OpenGL 用来在屏幕上绘制内容,但其实所有平台都会提供自己的 UI 框架供开发者使用,比如 Android 的 View 体系,随便画个方块或者显示几行字是不需要 OpenGL 的。OpenGL 是一种性能极高的绘制手段,应该用来做更有想象力的事,比如一些游戏引擎的绘制部分就能用 OpenGL 实现。

OpenGL 能处理更复杂的绘制,效果更流畅。

OpenGL 是 CPU 和 GPU 之间的桥梁,当我们使用 OpenGL 的时候,是将数据以一定的方式提供给 GPU 再执行绘制的,所以 OpenGL 规范的具体实现通常是显卡厂家提供的。

学习 OpenGL

避坑说明

  1. OpenGL 是面向过程的,在面向对象语言的开发环境下会很别扭,一定要时刻提醒自己
  2. OpenGL 是一个状态机,调用函数的时候必须想一下现在的上下文环境合不合适

学习资源

OpenGL 很庞大,并不适合从文档入门,从教程开始更合理一些。简单记录一下我在看的吧。

入门阶段不太需要追求知识面的广度和教程的效率,便于理解和坚持学下去才是最重要的,等有一定实力能分辨教程的优劣了,换一个教程重学一遍并不会慢。

环境搭建

首先的选择一个平台和一门编程语言,因为移动端的 OpenGL 是 ES 版本,功能会少一点,所以我打算用 MacOS 和 Rust。

OpenGL 的具体实现已经在显卡驱动里了,理论上使用 OpenGL 并不需要下载什么东西,但实际上还是需要一点辅助的库处理绘制之外的事情,以便我们能把精力集中在 OpenGL 本身。其中最重要的一个就是创建窗口,验证 OpenGL 代码正确与否的主要方式就是用眼睛看,在调试的平台上创建一个窗口应该需要使用平台提供的 API,这个过程没必要做过多学习,找个合适的库用起来就好了。

我选择的是 glium

其实 glium 不太合适,因为它做了 API 的包装,调用函数的时候还要学一遍 OpenGL 函数功能,再学一遍 glium 怎么对 OpenGL 做了包装。非常不建议使用。

实践效果展示

学习编程一定不能只看不写,最后这个区域就随便放一点代码和效果图吧,仅做记录。

image.png

代码调用流程:

  1. 创建事件循环用来更新绘制内容
  2. 创建窗口用来显示内容
  3. 创建 OpenGL 的上下文环境(再次提醒 OpenGL 是一个状态机)
  4. 打开窗口给个背景色

cargo run

image.png