计算机图形学编程(使用OpenGL和C++)(第2版) 01.环境搭建
计算机图形学编程(使用OpenGL和C++)(第2版)
这是我学习计算机图形学编程(使用OpenGL和C++)的笔记,主要记录学习心得及一些学习过程中遇到的问题和解决方案。源代码存放在github上。
参考资料:
- 原书资源(程序代码、模型、纹理、贴图及图表)下载
- ShaderToy学习笔记_龙湾开发的博客-CSDN博客
- shader开发实战学习笔记_龙湾开发的博客-CSDN博客
- GitHub - DragonBaySpark/practical_shader_development: shader开发实战学习笔记
1. 环境搭建
学习时采用WINDOWS平台,IDE是Microsoft Visual Studio 2022 ,采用C++17标准,源代码用utf-8格式保存。
1.1. 环境搭建
环境搭建中涉及的内容如下:
1.1.1. 窗口管理
采用 GLFW 做为窗口管理
GLFW 是一个开源的跨平台库,主要用于 OpenGL、Vulkan 和其他图形 API 的窗口管理和输入处理。它为开发者提供了创建窗口、上下文和处理输入设备(如键盘、鼠标、手柄等)的简单接口。
GLFW 的主要功能
- 窗口管理:
- 创建和管理窗口。
- 支持全屏模式和窗口模式。
- 提供多窗口支持。
- 上下文管理:
- 创建 OpenGL 或 Vulkan 的上下文。
- 管理上下文的生命周期。
- 输入处理:
- 捕获键盘、鼠标和手柄的输入事件。
- 支持自定义回调函数来处理输入。
- 跨平台支持:
- 支持 Windows、macOS 和 Linux。
GLFW 的优点
- 轻量级:专注于窗口和输入管理,不包含图形渲染功能。
- 易用性:API 简洁,易于集成到项目中。
- 高性能:为图形应用程序提供高效的窗口和输入管理
1.1.2. 扩展库
OpenGL 围绕一组基本功能和扩展机制进行组织。随着技术的发展,扩展机制可以用来支持新的功能。为了使用现代命令,需要执行很多相当复杂的代码。所以使用一个扩展库来处理这些细节已经成了标准做法,这样能让程序员可以直接使用现代 OpenGL 命令。扩展库有 Glee、GLLoader 和 GLEW,以及新版的 GL3W 和 GLAD。
本书采用 GLEW 作为扩展库。
GLEW(The OpenGL Extension Wrangler Library)是一个跨平台的开源库,用于加载和管理 OpenGL 扩展。它简化了开发者使用现代 OpenGL 功能的过程,尤其是在需要访问 OpenGL 扩展时。
GLEW 的主要功能
- 加载 OpenGL 扩展:
- 自动检测并加载系统支持的 OpenGL 扩展。
- 提供对现代 OpenGL 函数的访问,而无需手动获取函数指针。
- 跨平台支持:
- 支持 Windows、macOS 和 Linux 等主流操作系统。
- 易于集成:
-提供简单的 API,开发者只需初始化 GLEW 即可使用 OpenGL 扩展。
1.1.3. GLM(OpenGL 数学库)
GLM(OpenGL Mathematics)是一个基于 C++ 的数学库,专为图形应用设计,提供了与 OpenGL 着色语言(GLSL)一致的数学功能。它是一个轻量级、头文件形式的库,广泛用于 3D 图形开发中。
1.1.3.1. GLM 的主要功能
-
向量和矩阵运算:
- 支持常见的向量(如
vec2
,vec3
,vec4
)和矩阵(如mat3
,mat4
)类型。 - 提供加减乘除、点积、叉积等运算。
- 支持常见的向量(如
-
变换工具:
- 提供常用的 3D 变换函数,如平移、旋转、缩放。
- 支持生成投影矩阵(透视投影和正交投影)。
-
数学函数:
- 包括三角函数、指数函数、对数函数等。
- 支持线性插值、角度转换(弧度与角度之间的转换)等。
-
兼容 GLSL:
- 语法和功能与 GLSL 保持一致,便于开发者在 CPU 和 GPU 之间切换。
-
跨平台支持:
- 作为头文件库,无需额外编译,直接包含即可使用。
1.1.4. 纹理管理 SOIL2(Simple OpenGL Image Library 2)
SOIL2 是一个轻量级的开源图像加载库,专为 OpenGL 应用设计,用于加载纹理、保存图像以及生成纹理。它是原始 SOIL 库的改进版本,提供了更好的功能和维护。
1.1.4.1. SOIL2 的主要功能
-
加载图像为 OpenGL 纹理:
- 支持多种图像格式(如 PNG、JPEG、BMP、TGA 等)。
- 自动生成 Mipmaps,优化纹理性能。
-
保存图像:
- 支持将图像保存为常见格式(如 BMP、TGA)。
-
纹理工具:
- 提供纹理压缩支持。
- 支持加载立方体贴图(Cubemap)纹理。
-
跨平台支持:
- 支持 Windows、macOS 和 Linux。
1.1.5. 安装
安装有两种方式:
- 访问相应的官方网站,按其说明进行安装。
- 我已经准备好了相关安装包(OpenGLtemplate.zip),只需从github下载即可。
1.1.6. 创建Visual Studio 自定义项目模板
将下载的OpenGLtemplate.zip 解压到 C:\OpenGLtemplate,也可放在其它目录下。
创建一个自定义的项目模板,以便在 Visual Studio 中快速创建预配置的项目。通过这种方式,开发者可以避免重复配置项目环境,例如添加依赖库、设置编译选项等。
// 附加依赖项 输入以下内容
glfw3.lib
glew32.lib
soil2-debug.lib
opengl32.lib
采用 C++ 17标准
注意:
在实际项目运行时,需要将glew32.dll
放在可执行文件所在目录下。
1.1.7. 目录
1.1.7.1. 在Visual Studio中运行时
着色器文件的路径在代码中是相对目录时,则当前工作目录为项目所在目录。
如果遇到“找不到着色器文件”错误,可以用以下代码测试当前目录的绝对路径:
// 获取当前工作目录的路径std::filesystem::path currentPath = std::filesystem::current_path();// 获取绝对路径std::filesystem::path absolutePath = std::filesystem::absolute(currentPath);// 提取目录名称std::string directoryName = currentPath.filename().string();std::cout << "absolute_path: " << absolutePath.string() << std::endl;
以下是一个示例
absolute_path: C:\Users\Admin\git\e\15_computer_graphics_programming_in_opengl_with_cpp\chapter02\2_2_Point
该工程在创建时选择了“将解决方案和项目放在同一目录下”。
1.1.7.2. 在exe文件所在目录下运行时
exe文件所在目录为当前工作目录。
1.1.8. 问题
1.1.8.1. 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
右键点击你的项目,选择“属性”。
在左侧树中导航到 Configuration Properties -> Linker -> Input。
找到 Ignore Specific Default Libraries 选项,在这里输入你想要忽略的库名称,如 MSVCRT
1.1.8.2. 控制台的输出为乱码
源代码用utf-8格式保存,如果控制台的输出为乱码,在程序中添加以下代码:
system("chcp 65001 > nul"); // 设置为 UTF-8 编码
1.2. 参考资料
- GLFW
- GLEW
- GLM
- SOIL2