计算机图形学编程(使用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.mzph.cn/news/904245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第三十二天

LeetCode/卡码网题目: 518. 零钱兑换 II377. 组合总和 Ⅳ790. 多米诺和托米诺平铺(每日一题)57. 爬楼梯&#xff08;第八期模拟笔试&#xff09; 其他: 今日总结 往期打卡 背包问题特点: 滚动数组背包遍历顺序 完全背包从小到大,即基于当前物品更新过的继续更新01背包从大到…

第十六届蓝桥杯 2025 C/C++组 密密摆放

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路详解: 发个牢骚&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; P12337 [蓝桥杯 2025 省 AB/Python B 第二…

分析rand()和srand()函数的功能

rand()和srand()函数原型&#xff1a; int rand(void) 返回一个范围在 0 到 RAND_MAX 之间的伪随机数。 void srand(unsigned int seed)用来给rand() 设置随机数发生器&#xff0c;随机数发生器输出不同的数值&#xff0c;rand() 就会生成不同的随机数 1)、在“D:\Keil_v5\AR…

debuginfo详解

debuginfo 是 Linux 系统中存储调试符号和源代码信息的特殊软件包&#xff0c;用于分析内核或用户态程序的崩溃转储文件&#xff08;如 vmcore、coredump&#xff09;。它在调试复杂问题&#xff08;如内核崩溃、程序段错误&#xff09;时至关重要。以下是其核心作用、安装方法…

Python 爬取微店商品列表接口(item_search)的实战指南

在电商数据分析、市场调研或竞品分析中&#xff0c;获取商品列表信息是常见的需求。微店作为知名的电商平台&#xff0c;提供了丰富的商品资源和相应的 API 接口。本文将详细介绍如何使用 Python 爬虫技术&#xff0c;通过微店的 item_search 接口根据关键词搜索商品列表&#…

【bazel】bazel简介及简单使用

文章目录 1. What is bazel?2. bazel的核心原理2.1 bazel的构建模型2.2 bazel的核心概念2.3 bazel的关键特性 3. bazel的使用3.1 划分项目结构3.2 编写BUILD文件3.3 bazel常用命令3.4 bazel依赖管理 参考内容 1. What is bazel? bazel是一个开源的构建工具&#xff0c;它基于…

【Mytais系列】Myatis的设计模式

目录 设计模式 1. 工厂模式&#xff08;Factory Pattern&#xff09; 2. 建造者模式&#xff08;Builder Pattern&#xff09; 3. 动态代理模式&#xff08;Dynamic Proxy Pattern&#xff09; 4. 模板方法模式&#xff08;Template Method Pattern&#xff09; 5. 策略模…

【unity游戏开发入门到精通——UGUI】Mask组件实现UGUI遮罩

注意&#xff1a;考虑到UGUI的内容比较多&#xff0c;我将UGUI的内容分开&#xff0c;并全部整合放在【unity游戏开发——UGUI】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言如何实现UI遮罩1、Mask组件2、实例3、注意 专栏推荐完结 前言 Mask遮罩是…

Github2025-05-04php开源项目日报 Top10

根据Github Trendings的统计,今日(2025-05-04统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Shell项目1Vue项目1Java项目1ASP项目1SecLists - 安全测试人员的伴侣 创建周期:4375 天开发语言:PHP协议类型:MIT LicenseStar数量…

MyBatis 一对多与多对一映射详解教程

一、基础概念与场景 一对多&#xff08;One-to-Many&#xff09; • 定义&#xff1a;一个父对象包含多个子对象。 例如&#xff1a;一个商品&#xff08;Goods&#xff09;对应多个商品详情&#xff08;GoodsDetail&#xff09; • 实体类表现&#xff1a;父类中包含 List&l…

ChatGPT:重塑人工智能交互范式的破晓之作

2022年11月30日,总部位于旧金山的研究公司OpenAI正式发布了ChatGPT——一款以病毒式传播速度席卷全球的AI聊天机器人。它不仅能像人类一样生成内容、回答问题和解决问题,更在推出后的两个月内吸引了超过1亿月活跃用户,刷新了消费级技术应用的最快采用率纪录。这一里程碑事件…

在项目中如何对Map List等对象序列化及反序列化

我们知道&#xff0c;在自定义类中&#xff0c;若想完成序列化必须要实现Serializable接口。 那么在实现后如何进行序列化呢&#xff1f; 一.普通对象 序列化&#xff1a; 1.首先我们要定义一个 序列化所需要的工具类 ObjectMapper //定义序列化所需要的工具类 转化机器…

笔试专题(十五)

文章目录 排序子序列题解代码 消减整数题解代码 最长公共子序列(二)题解代码 排序子序列 题目链接 题解 1. 贪心 模拟 2. 1 2 3 2 2 应该是有两个排列子序列的&#xff0c;所以i n-1时ret 3. 把水平的位置和上升部分&#xff0c;水平位置和下降部分分为一个排列子序列 代…

Amazon Bedrock Converse API:开启对话式AI新体验

Amazon Bedrock Converse API&#xff1a;开启对话式AI新体验 前言 在当今人工智能飞速发展的时代&#xff0c;对话式AI已成为众多应用的核心组成部分。从智能客服到智能助手&#xff0c;对话式AI为用户带来了便捷且高效的交互体验。而Amazon Bedrock Converse API的出现&…

【Springboot知识】Springboot计划任务Schedule详解

文章目录 Spring Boot 定时任务从原理到实现详解一、核心原理分析1. 架构分层2. 核心组件3. 线程模型 二、基础实现步骤1. 添加依赖2. 主类配置3. 定时任务类 三、高级配置技巧1. 自定义线程池2. 动态配置参数3. 分布式锁集成&#xff08;Redis示例&#xff09; 四、异常处理机…

MySQL:联合查询

目录 一、笛卡尔积 ​二、内连接 三、外连接 &#xff08;1&#xff09;左外连接 &#xff08;2&#xff09;右外连接 &#xff08;3&#xff09;全外连接 四、自连接 五、子查询 &#xff08;1&#xff09;单行子查询 &#xff08;2&#xff09;多行子查询 &…

深入理解 Cortex-M3 的内核寄存器组

每个 MCU 开发工程师一定都了解寄存器这个东西&#xff0c;以 STM32 为例&#xff0c;其拥有非常多的外设模块&#xff0c;如串口、SPI、IIC 等等&#xff0c;如果要使用这些外设&#xff0c;使其按照我们的要求工作&#xff0c;就需要配置这些外设的寄存器&#xff0c;往这些寄…

网络安全自动化:找准边界才能筑牢安全防线

数字时代&#xff0c;企业每天要面对成千上万的网络攻击。面对庞大的服务器群、分散的团队和长期不重启的设备&#xff0c;很多企业开始思考&#xff1a;哪些安全操作适合交给机器自动处理&#xff1f;哪些必须由人工把关&#xff1f;今天我们就用大白话聊聊这件事。 一、这些事…

C++负载均衡远程调用学习之负载均衡算法与实现

目录 01 lars 系统架构回顾 02 lars-lbAgentV0.4-route_lb处理report业务流程 03 lars-lbAgentV0.4-负责均衡判断参数配置 04 lars-lbAgentV0.4-负载均衡idle节点的失败率判断 05 lars-lbAgentV0.4-负载均衡overload节点的成功率判断 06 lars-lbAgentV0.4-负载均衡上报提交…

领略算法真谛: 多源bfs

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…