学习笔记——计算机图形学与OpenGL
本文目录 5 个章节
学习笔记——计算机图形学与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/
- 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
- 第一个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
- 选定像素格式
- 创建渲染环境
- 使渲染环境生效
设置OpenGL矩阵
