---
title: "学习笔记——计算机图形学与OpenGL"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/computer-graphics-opengl-notes/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/08-图形学与三维重构/学习笔记——计算机图形学与OpenGL.md"
content_hash: a09f389c15839d97bf9b9ca0d685b868dc596800507a18c585b7d1e300be9743
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 学习笔记——计算机图形学与OpenGL

> 创建时间：2019/12/27 16:32

* * *

## 绪论

什么是OpenGL？
OpenGL（Open Graphics Library，开放式图形库）,是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口（API）。
这个接口由近350个不同的函数调用组成，用来绘制从简单的图形比特到复杂的三维景象。常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。

OpenGL规范描述了绘制2D和3D图形的抽象API。尽管这些API可以完全通过软件实现，但它是为大部分或者全部使用硬件加速而设计的。
OpenGL的API定义了若干可被客户端程序调用的函数，以及一些具名整型常量。

#### 相关程序库

OpenGL不仅语言无关，而且平台无关。OpenGL纯粹专注于渲染，而不提供输入、音频以及窗口相关的API。

早期的 OpenGL 版本会一同发布配套的GLU库，提供一些同时代硬件尚不支持的简单功能。

  * GLFW
  * GLUT
  * GLEW、GLEE
  * OpenGL Performer库——由SGI开发并可以在IRIX、Linux和Microsoft Windows的一些版本上使用，构建于OpenGL，可以创建实时可视化仿真程序。

当开发者需要使用最新的OpenGL扩展时，他们往往需要使用GLEW库或者是GLEE库提供的功能，可以在程序的运行期判断当前硬件是否支持相关的扩展，防止程序崩溃甚至造成硬件损坏。这类库利用动态加载技术（dlsym、GetProcAddress等函数）搜索各种扩展的信息。

还有几个库也创建在OpenGL之上，提供了OpenGL本身没有的功能：

#### 上下文与窗口包

OpenGL 上下文（英语：OpenGL context）的创建过程相当复杂，在不同的操作系统上也需要不同的做法。因此很多游戏开发和用户界面库都提供了自动创建 OpenGL 上下文的功能，其中包括SDL、Allegro、SFML、FLTK、Qt等。也有一些库是专门用来创建 OpenGL 窗口的，其中最早的便是GLUT，后被freeglut取代，比较新的也有GLFW可以使用。

>   * 学习方法：刷视频，一边学一边实现项目(复杂不重要的部分，如果有整理的比较好的文档，可以copy的就copy，真正与OpenGL有关的、锻炼能力的内容，自己上手敲)，不太清楚的知识点做注释，有不懂得问题查书，精华性的东西整理在笔记上。计算机专业知识的学习，最重要的是实践练习。一边学一边练手，才能真正学会，光看一遍是学不会的。 **最终达到的效果是，在学的过程中，自己完成了一个完整的OpenGL项目，实现了学习的知识，并且方便复习。**
>   * 快速刷一边视频，达到能看懂代码，能自己扩展编写修改代码的程度就够了。
>   * 关于查阅用的资料：windows窗口部分的知识，看windows API，OpenGL的内容，看书。很多东西能找到查阅的资料就可以，不需要自己再浪费时间记录整理了。
>   * 不要听一行敲一行，那样效率太低了。听完一整段，然后跟着例子过一遍。 不懂得知识再查阅
>

* * *

> OpenGL学习网站
>  我主要使用：<https://learnopengl-cn.readthedocs.io/zh/latest/>[
>  ](https://learnopengl-cn.readthedocs.io/zh/latest/)

>   * [https://learnopengl.com/](https://learnopengl.com)
>   * <http://www.opengl-tutorial.org/>
>   * <https://www.scratchapixel.com/>
>   * <https://zhuanlan.zhihu.com/p/30374898>
>   * <https://learnopengl-cn.github.io/>
>

>   * http://www.opengl-tutorial.org/
>  正在追的一套教程。感觉难度适中，英文也比较简单，阅读无压力
>

>   * http://ogldev.atspace.co.uk/index.html
>  知乎上有人推荐，后面有一些skybox,shadow volume 等实现技巧的教程。打算在看完上面的教程后，试试这个
>

>   * http://www.scratchapixel.com/
>  同样是知乎推荐。看起来更倾向于计算机图形学，而不仅仅是一个 OpenGL 的教程。打算在刷完上面两个教程后看一下
>

>   * https://learnopengl-cn.readthedocs.io/zh/latest/
>  补充一个 ，这个网站也很基础，内容非常好，水平和第一个类似，并且还有中文。至少看到纹理映射这篇的教程，讲得比第一个链接更翔实。可以和第一个互相参考，强推。
>

* * *

## 创建windows窗口

>   * Windows创建窗口涉及的概念以及相关函数:
>  https://blog.csdn.net/DY_1024/article/details/89178348
>   * [Windows API](https://docs.microsoft.com/en-us/windows/win32/apiindex/api-index-portal)
>

  * 第一个BUG： const wchar_t * 类型的实参与 "LPCSTR" 类型的形参不兼容
宽类型和窄类型不兼容所导致

windowsAPI中
LPCTSTR用来表示你的字符是否使用UNICODE。
是两种类型：LPCSTR和LPCWSTR其中之一
如果你的程序定义了UNICODE或者其他相关的宏，那么这个字符或者字符串将被作为UNICODE字符串，即为 LPCWSTR，否则就是标准的ANSI字符串，即为LPCSTR。

VS默认项目是ANSI字符串编码。此时，LPCTSTR==LPCWSTR。
若把宽类型 L"stringTest"传递给LPCTSTR，就会报错。
方法一：
使用_T宏，它在“tchar.h”中定义，它能够自动识别当前编译器字符串的储存格式并做出相应转换，避免这种类型的编译错误。
方法二：
右击“解决方案资源管理器”中的项目，“属性→配置属性→常规→项目默认值→字符集”，默认的选项是“使用多字节字符集”，将它改为“使用Unicode字符集”即可。

## 搭建OpenGL渲染环境

> Step
>
>   1. 选定像素格式
>   2. 创建渲染环境
>   3. 使渲染环境生效
>

设置OpenGL矩阵

![assets/%E4%B8%96%E7%95%8C%E5%9D%90%E6%A0%87.png](/media/54c8e28a45698fd53694.png)
