当前位置: 首页 > ds >正文

计算机图形学编程(使用OpenGL和C++)(第2版) 01.环境搭建

计算机图形学编程(使用OpenGL和C++)(第2版)

这是我学习计算机图形学编程(使用OpenGL和C++)的笔记,主要记录学习心得及一些学习过程中遇到的问题和解决方案。源代码存放在github上。

参考资料:

  1. 原书资源(程序代码、模型、纹理、贴图及图表)下载
  2. ShaderToy学习笔记_龙湾开发的博客-CSDN博客
  3. shader开发实战学习笔记_龙湾开发的博客-CSDN博客
  4. 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 的主要功能

  1. 窗口管理:
  • 创建和管理窗口。
  • 支持全屏模式和窗口模式。
  • 提供多窗口支持。
  1. 上下文管理:
  • 创建 OpenGL 或 Vulkan 的上下文。
  • 管理上下文的生命周期。
  1. 输入处理:
  • 捕获键盘、鼠标和手柄的输入事件。
  • 支持自定义回调函数来处理输入。
  1. 跨平台支持:
  • 支持 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 的主要功能

  1. 加载 OpenGL 扩展:
  • 自动检测并加载系统支持的 OpenGL 扩展。
  • 提供对现代 OpenGL 函数的访问,而无需手动获取函数指针。
  1. 跨平台支持:
  • 支持 Windows、macOS 和 Linux 等主流操作系统。
  1. 易于集成:
    -提供简单的 API,开发者只需初始化 GLEW 即可使用 OpenGL 扩展。

1.1.3. GLM(OpenGL 数学库)

GLM(OpenGL Mathematics)是一个基于 C++ 的数学库,专为图形应用设计,提供了与 OpenGL 着色语言(GLSL)一致的数学功能。它是一个轻量级、头文件形式的库,广泛用于 3D 图形开发中。

1.1.3.1. GLM 的主要功能
  1. 向量和矩阵运算

    • 支持常见的向量(如 vec2, vec3, vec4)和矩阵(如 mat3, mat4)类型。
    • 提供加减乘除、点积、叉积等运算。
  2. 变换工具

    • 提供常用的 3D 变换函数,如平移、旋转、缩放。
    • 支持生成投影矩阵(透视投影和正交投影)。
  3. 数学函数

    • 包括三角函数、指数函数、对数函数等。
    • 支持线性插值、角度转换(弧度与角度之间的转换)等。
  4. 兼容 GLSL

    • 语法和功能与 GLSL 保持一致,便于开发者在 CPU 和 GPU 之间切换。
  5. 跨平台支持

    • 作为头文件库,无需额外编译,直接包含即可使用。

1.1.4. 纹理管理 SOIL2(Simple OpenGL Image Library 2)

SOIL2 是一个轻量级的开源图像加载库,专为 OpenGL 应用设计,用于加载纹理、保存图像以及生成纹理。它是原始 SOIL 库的改进版本,提供了更好的功能和维护。

1.1.4.1. SOIL2 的主要功能
  1. 加载图像为 OpenGL 纹理

    • 支持多种图像格式(如 PNG、JPEG、BMP、TGA 等)。
    • 自动生成 Mipmaps,优化纹理性能。
  2. 保存图像

    • 支持将图像保存为常见格式(如 BMP、TGA)。
  3. 纹理工具

    • 提供纹理压缩支持。
    • 支持加载立方体贴图(Cubemap)纹理。
  4. 跨平台支持

    • 支持 Windows、macOS 和 Linux。

1.1.5. 安装

安装有两种方式:

  1. 访问相应的官方网站,按其说明进行安装。
  2. 我已经准备好了相关安装包(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. 参考资料

  1. GLFW
  2. GLEW
  3. GLM
  4. SOIL2
http://www.xdnf.cn/news/3966.html

相关文章:

  • Python的ArcPy基于Excel表格对大量遥感影像批量重分类
  • 第8章 Python 其他数据类型概述
  • LeetCode 1007. 行相等的最少多米诺旋转 题解
  • ZArchiver正版:高效文件管理,完美解压体验
  • 二、大模型原理:图文解析Transformer原理与代码
  • 第十章.XML
  • Android第三次面试总结之activity和线程池篇(补充)
  • C++基础算法:Dijkstra
  • Python 函数装饰器和闭包(变量作用域规则)
  • 基于k8s系统的API网关-kong网关
  • C++类与对象—下:夯实面向对象编程的阶梯
  • c++STL——set和map的使用
  • 5个情感丰富GPT-4o图像提示词(不是吉卜力风格)
  • transfomer网络构建
  • 平衡二叉搜索树模拟实现1-------AVL树(插入,删除,查找)
  • Fine Structure-Aware Sampling(AAAI 2024)论文笔记和启发
  • 交叉编译 opencv-4.10
  • [MATLAB]通过50个MATLAB程序理解信号与系统的核心概念
  • 学习黑客 TCP/IP
  • 【Springboot进阶】springboot+mybatis+jsqlparser实现数据权限控制
  • 57认知干货:AI机器人产业
  • 力扣解题汇总(困难)
  • 数据结构(4) 堆
  • 6 RAG知识库 和 微调 如何选择?
  • Kubernetes(k8s)学习笔记(五)--部署Ingress实现域名访问和负载均衡
  • 排序功法入门指南【江湖算法笔记】
  • 【计算机网络】HTTP中GET和POST的区别是什么?
  • 【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.1 数据质量评估指标(完整性/一致性/准确性)
  • VSCode通过SSH连接VMware虚拟机
  • opencv的contours