{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/computer-graphics-opengl-notes/",
  "atlas": "https://www.pystone.net/?node=computer-graphics-opengl-notes#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/computer-graphics-opengl-notes.md",
  "context": "https://www.pystone.net/notes/computer-graphics-opengl-notes.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:computer-graphics-opengl-notes",
  "slug": "computer-graphics-opengl-notes",
  "title": "学习笔记——计算机图形学与OpenGL",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "学习笔记——计算机图形学与OpenGL",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "a09f389c15839d97bf9b9ca0d685b868dc596800507a18c585b7d1e300be9743",
  "assets": [
    {
      "reference": "assets/%E4%B8%96%E7%95%8C%E5%9D%90%E6%A0%87.png",
      "url": "/media/54c8e28a45698fd53694.png",
      "mediaType": "image/png",
      "contentHash": "54c8e28a45698fd53694d9583f91ed081d4e1a9780b1661b2055b31612d9ad7e",
      "byteLength": 22113,
      "width": 261,
      "height": 157
    }
  ],
  "headings": [
    {
      "depth": 1,
      "text": "学习笔记——计算机图形学与OpenGL",
      "anchor": "学习笔记计算机图形学与opengl",
      "citation": "https://www.pystone.net/notes/computer-graphics-opengl-notes/#%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9B%BE%E5%BD%A2%E5%AD%A6%E4%B8%8Eopengl"
    },
    {
      "depth": 2,
      "text": "绪论",
      "anchor": "绪论",
      "citation": "https://www.pystone.net/notes/computer-graphics-opengl-notes/#%E7%BB%AA%E8%AE%BA"
    },
    {
      "depth": 4,
      "text": "相关程序库",
      "anchor": "相关程序库",
      "citation": "https://www.pystone.net/notes/computer-graphics-opengl-notes/#%E7%9B%B8%E5%85%B3%E7%A8%8B%E5%BA%8F%E5%BA%93"
    },
    {
      "depth": 4,
      "text": "上下文与窗口包",
      "anchor": "上下文与窗口包",
      "citation": "https://www.pystone.net/notes/computer-graphics-opengl-notes/#%E4%B8%8A%E4%B8%8B%E6%96%87%E4%B8%8E%E7%AA%97%E5%8F%A3%E5%8C%85"
    },
    {
      "depth": 2,
      "text": "创建windows窗口",
      "anchor": "创建windows窗口",
      "citation": "https://www.pystone.net/notes/computer-graphics-opengl-notes/#%E5%88%9B%E5%BB%BAwindows%E7%AA%97%E5%8F%A3"
    },
    {
      "depth": 2,
      "text": "搭建OpenGL渲染环境",
      "anchor": "搭建opengl渲染环境",
      "citation": "https://www.pystone.net/notes/computer-graphics-opengl-notes/#%E6%90%AD%E5%BB%BAopengl%E6%B8%B2%E6%9F%93%E7%8E%AF%E5%A2%83"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:graphics-and-3d-reconstruction",
      "title": "图形学与三维重构",
      "url": "https://www.pystone.net/notes/graphics-and-3d-reconstruction/",
      "atlas": "https://www.pystone.net/?node=graphics-and-3d-reconstruction#knowledge-atlas",
      "label": "图形学与三维重构",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "本层中的“学习笔记——计算机图形学与OpenGL”导航项",
      "citation": "https://www.pystone.net/notes/graphics-and-3d-reconstruction/#%E6%9C%AC%E5%B1%82"
    },
    {
      "id": "note:game-dev-graphics-performance",
      "title": "游戏研发、图形与性能",
      "url": "https://www.pystone.net/notes/game-dev-graphics-performance/",
      "atlas": "https://www.pystone.net/?node=game-dev-graphics-performance#knowledge-atlas",
      "label": "游戏研发、图形与性能",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "计算机图形学与 OpenGL补充图形学基础。",
      "citation": "https://www.pystone.net/notes/game-dev-graphics-performance/#%E4%BB%8E%E6%B8%B2%E6%9F%93%E6%9C%BA%E5%88%B6%E5%88%B0%E6%80%A7%E8%83%BD"
    }
  ],
  "contentMarkdown": "# 学习笔记——计算机图形学与OpenGL\n\n> 创建时间：2019/12/27 16:32\n\n* * *\n\n## 绪论\n\n什么是OpenGL？\nOpenGL（Open Graphics Library，开放式图形库）,是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口（API）。\n这个接口由近350个不同的函数调用组成，用来绘制从简单的图形比特到复杂的三维景象。常用于CAD、虚拟现实、科学可视化程序和电子游戏开发。\n\nOpenGL规范描述了绘制2D和3D图形的抽象API。尽管这些API可以完全通过软件实现，但它是为大部分或者全部使用硬件加速而设计的。\nOpenGL的API定义了若干可被客户端程序调用的函数，以及一些具名整型常量。\n\n#### 相关程序库\n\nOpenGL不仅语言无关，而且平台无关。OpenGL纯粹专注于渲染，而不提供输入、音频以及窗口相关的API。\n\n早期的 OpenGL 版本会一同发布配套的GLU库，提供一些同时代硬件尚不支持的简单功能。\n\n  * GLFW\n  * GLUT\n  * GLEW、GLEE\n  * OpenGL Performer库——由SGI开发并可以在IRIX、Linux和Microsoft Windows的一些版本上使用，构建于OpenGL，可以创建实时可视化仿真程序。\n\n当开发者需要使用最新的OpenGL扩展时，他们往往需要使用GLEW库或者是GLEE库提供的功能，可以在程序的运行期判断当前硬件是否支持相关的扩展，防止程序崩溃甚至造成硬件损坏。这类库利用动态加载技术（dlsym、GetProcAddress等函数）搜索各种扩展的信息。\n\n还有几个库也创建在OpenGL之上，提供了OpenGL本身没有的功能：\n\n#### 上下文与窗口包\n\nOpenGL 上下文（英语：OpenGL context）的创建过程相当复杂，在不同的操作系统上也需要不同的做法。因此很多游戏开发和用户界面库都提供了自动创建 OpenGL 上下文的功能，其中包括SDL、Allegro、SFML、FLTK、Qt等。也有一些库是专门用来创建 OpenGL 窗口的，其中最早的便是GLUT，后被freeglut取代，比较新的也有GLFW可以使用。\n\n>   * 学习方法：刷视频，一边学一边实现项目(复杂不重要的部分，如果有整理的比较好的文档，可以copy的就copy，真正与OpenGL有关的、锻炼能力的内容，自己上手敲)，不太清楚的知识点做注释，有不懂得问题查书，精华性的东西整理在笔记上。计算机专业知识的学习，最重要的是实践练习。一边学一边练手，才能真正学会，光看一遍是学不会的。 **最终达到的效果是，在学的过程中，自己完成了一个完整的OpenGL项目，实现了学习的知识，并且方便复习。**\n>   * 快速刷一边视频，达到能看懂代码，能自己扩展编写修改代码的程度就够了。\n>   * 关于查阅用的资料：windows窗口部分的知识，看windows API，OpenGL的内容，看书。很多东西能找到查阅的资料就可以，不需要自己再浪费时间记录整理了。\n>   * 不要听一行敲一行，那样效率太低了。听完一整段，然后跟着例子过一遍。 不懂得知识再查阅\n>\n\n* * *\n\n> OpenGL学习网站\n>  我主要使用：<https://learnopengl-cn.readthedocs.io/zh/latest/>[\n>  ](https://learnopengl-cn.readthedocs.io/zh/latest/)\n\n>   * [https://learnopengl.com/](https://learnopengl.com)\n>   * <http://www.opengl-tutorial.org/>\n>   * <https://www.scratchapixel.com/>\n>   * <https://zhuanlan.zhihu.com/p/30374898>\n>   * <https://learnopengl-cn.github.io/>\n>\n\n>   * http://www.opengl-tutorial.org/\n>  正在追的一套教程。感觉难度适中，英文也比较简单，阅读无压力\n>\n\n>   * http://ogldev.atspace.co.uk/index.html\n>  知乎上有人推荐，后面有一些skybox,shadow volume 等实现技巧的教程。打算在看完上面的教程后，试试这个\n>\n\n>   * http://www.scratchapixel.com/\n>  同样是知乎推荐。看起来更倾向于计算机图形学，而不仅仅是一个 OpenGL 的教程。打算在刷完上面两个教程后看一下\n>\n\n>   * https://learnopengl-cn.readthedocs.io/zh/latest/\n>  补充一个 ，这个网站也很基础，内容非常好，水平和第一个类似，并且还有中文。至少看到纹理映射这篇的教程，讲得比第一个链接更翔实。可以和第一个互相参考，强推。\n>\n\n* * *\n\n## 创建windows窗口\n\n>   * Windows创建窗口涉及的概念以及相关函数:\n>  https://blog.csdn.net/DY_1024/article/details/89178348\n>   * [Windows API](https://docs.microsoft.com/en-us/windows/win32/apiindex/api-index-portal)\n>\n\n  * 第一个BUG： const wchar_t * 类型的实参与 \"LPCSTR\" 类型的形参不兼容\n宽类型和窄类型不兼容所导致\n\nwindowsAPI中\nLPCTSTR用来表示你的字符是否使用UNICODE。\n是两种类型：LPCSTR和LPCWSTR其中之一\n如果你的程序定义了UNICODE或者其他相关的宏，那么这个字符或者字符串将被作为UNICODE字符串，即为 LPCWSTR，否则就是标准的ANSI字符串，即为LPCSTR。\n\nVS默认项目是ANSI字符串编码。此时，LPCTSTR==LPCWSTR。\n若把宽类型 L\"stringTest\"传递给LPCTSTR，就会报错。\n方法一：\n使用_T宏，它在“tchar.h”中定义，它能够自动识别当前编译器字符串的储存格式并做出相应转换，避免这种类型的编译错误。\n方法二：\n右击“解决方案资源管理器”中的项目，“属性→配置属性→常规→项目默认值→字符集”，默认的选项是“使用多字节字符集”，将它改为“使用Unicode字符集”即可。\n\n## 搭建OpenGL渲染环境\n\n> Step\n>\n>   1. 选定像素格式\n>   2. 创建渲染环境\n>   3. 使渲染环境生效\n>\n\n设置OpenGL矩阵\n\n![](assets/%E4%B8%96%E7%95%8C%E5%9D%90%E6%A0%87.png)\n"
}
