-
参考书目:Computer Graphics Programming in OpenGL Using C++ by V Scott Gordon John L Clevenger (z-lib.org)
下载方式: zlibrary 网站(https://zh.ng1lib.org/)中搜索书名 -
OpenGL 官方帮助手册,网址:https://www.opengl.org/sdk/docs/man
-
书中的例子需要 GLM 库,在附录有教安装步骤,GLM 库 的文档,网址:
https://glm.g-truc.net/0.9.9/index.html -
SOLI 库:用来加载图片纹理图像,网址: https://github.com/SpartanJ/soil2
-
3D 图形变成相关的书籍推荐:
• (Sellers et al.) OpenGL SuperBible [SW15]
• (Kessenich et al.) OpenGL Programming Guide [KS16] (the “red book”)
• (Wolff) OpenGL 4 Shading Language Cookbook [WO13]
• (Angel and Shreiner) Interactive Computer Graphics [AS14]
• (Luna) Introduction to 3D Game Programming with DirectX 12 [LU16] -
如何查找电脑的显卡能否支持什么版本的OpenGL
① 计算机管理 -> 设备管理器 -> 显示适配器 -> Interl® HD Graphics 620
-
用测试工具GPU_Caps_Viewer查看显卡支持的OpenGL的版本号,可能是 4.1.书中说最好支持4.3以上,所以不确定是否有影响
-
下载了 GLview 免费软件,查看版本号,图中显示,可以支持 4.4的版本,应该能满足书中的要求,GLview 的压缩包,解压打开直接用即可,不需要安装
-
确保 OpenGL 的版本号之后,需要编译 GLFW, 编译之前,需要安装 cmake,cmake 网址在:https://cmake.org
cmake 下载, 网址:https://cmake.org/download/
公众号安装教程: https://mp.weixin.qq.com/s/6Pu9qQgwoaT2WvX37uK_aw
下载 GLFW
下载 glfw-3.3.6,网址是:https://www.glfw.org/
位置:E:\pg\code\220124 computer graphic\glfw-3.3.6
下载 cmake,网址是:https://cmake.org/download/
位置:F:\cmake\cmake-3.22.1-windows-x86_64\bin
貌似直接打开 cmake-gui.exe 就能用,不需要安装,但是在电脑 cmd 输入 cmake –version看不到 cmake的信息。以下是 cmake 的界面
打开cmake, 用 cmake 编译 glfw 文件夹,具体步骤是,
①“where is the source code”输入 glfw 文件夹所在位置“E:/pg/code/220124 computer graphic/glfw-3.3.6/glfw-3.3.6”
②“where to build the binaries”输入 cmake生成文件想要存储的位置“E:/pg/code/220124 computer graphic/CmakeGLFW”
③点击 “configure”,由于电脑装的是 vs2017, 注意跳出的窗口要选择 VS2017
④ 编译成功后,选择“generate”,在生成的文件夹中可以看到 “GLFW.sln”,用vs2017打开
⑤ VS2017 打开 “GLFW.sln”后,直接点击“本地 Windows 编译器”,即可直接编译
图 cmake 界面
图 点击 configure 后弹窗,需要选择电脑安装的VS版本,电脑安装2017VS,所以选择2017
图 cmake 编译 GLFW 后生成的文件夹,其中 GLFW.sln 文件需要用 VS2017打开
图 VS2017 成功打开 GLFW.sln 后,直接点击 “本地 Windows 编译器”,VS开始编译
结果:上述步骤,主要生成了三个文件,在后续工作中会用到
① 库 “glfw3.lib”位置 “E:\pg\code\220124 computer graphic\CmakeGLFW\src\Debug”,就是在cmake 编译 glfw 文件后生成的文件夹 CmakeGLFW 中
② 两个头文件,在 GLFW 文件夹中,位置是: 就是在,网上下载的 glfw 的文件夹 include 中,有 GLFW文件夹
E:\pg\code\220124 computer graphic\glfw-3.3.6\glfw-3.3.6\include\GLFW
下载 GLEW
网址:http://glew.sourceforge.net/
① 注意下载的 window 版本下的,而不是普通的 zip
② 位置:E:\pg\code\220124 computer graphic\glew-2.1.0-win32
③ 需要的文件
文件 glew32.dll 位置: bin 文件夹 -> Release 文件夹 -> x64 文件夹
库 glew32.lib 位置: lib 文件夹 -> Release 文件夹 -> x64 文件夹
文件夹 GL 位置: include 文件夹 -> GL 文件夹
下载 GLM
网址:https://github.com/g-truc/glm/releases/tag/0.9.8.0
版本:0.9.8.0
Csdn 参考教程: https://blog.csdn.net/Wonz5130/article/details/83116009
教程过程:
步骤是,在 VS 创建的项目所在文件夹中,将下载的 glm-0.9.8.0 复制进去,在 VS 界面中,将这个项目的属性中,“添加包括的目录 Additional Include Directories ”添加 glm 的文件夹,然后在项目的源代码里面输入头文件:
//glm
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp> //需要什么变换,就导入什么文件,具体可以去官网看
#include <glm/gtc/type_ptr.hpp>
需要的文件:压缩包解压后,glm文件夹
下载 SOIL2 库
首先下载 premake 工具,需要用 premake5.exe
Premake 下载网址 : https://premake.github.io/download
SOIL2 下载网址: https://github.com/SpartanJ/soil2
SOLIL2 和 premake 下载后的压缩包存储位置: E:\pg\code\220124 computer graphic
将 premake5.exe 复制到 SOIL2 文件夹,然后在 SOIL2 文件夹的路径上 更改为 cmd,调出在这个路径下的命令窗口:
图 如何在 SOIL2 文件夹中,调出该路径下的命令窗口
在 SOIL2 库所在路径下的cmd 窗口 输入:premake5 vs2017
打开 SOIL2 文件夹 -> make 文件夹 -> windows 文件夹 ,位置为:
E:\pg\code\220124 computer graphic\SOIL2-master\SOIL2-master\make\windows
右键用 VS2017 打开 SOIL2.sln
打开 VS2017后,右键点击左边栏 “soil2-static-lib”-> “生成”
如果报错:
MSB8036 找不到 Windows SDK 版本 8.1。请安装所需版本的 Windows SDK,或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更改 SDK 版本。
解决方法:
参考网址:
https://blog.csdn.net/weixin_44981971/article/details/122035658?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_aa&utm_relevant_index=2
实际步骤:
① “项目” -> “重定解决方案目标”
② 在弹出窗口,默认选项,直接按确定
③ 右键选定 “soil2-static-lib”,选择“重定向项目”,弹窗中按照默认选项,选择确认
④ 重复报错前的那一步,右键点击左边栏 “soil2-static-lib”-> “生成”,此时就没有报错了
建立自己的 lib 库 和 include 库
在自己喜欢的电脑储存位置上,建立一个文件夹,这里命名为 0126 template, 文件夹下再建立两个文件夹,分别命名 “lib”和“include”。另外,将 glew32.dll 文件复制进该文件夹,复制来源:
glew32.lib: E:\pg\code\220124 computer graphic\glew-2.1.0-win32\glew-2.1.0\bin\Release\Win32
“lib”文件夹中,三个文件:glew32.lib , glfw3.lib, soil2-debug.lib, 位置分别在:
glew32.lib:E:\pg\code\220124 computer graphic\glew-2.1.0-win32\glew-2.1.0\lib\Release\x64
glfw3.lib:E:\pg\code\220124 computer graphic\CmakeGLFW\src\Debug
soil2-debug.lib: E:\pg\code\220124 computer graphic\SOIL2-master\SOIL2-master\lib\windows
“include”文件夹中,四个文件夹,GL, GLFW, glm, SOIL2, 位置分别在:
GL: E:\pg\code\220124 computer graphic\glew-2.1.0-win32\glew-2.1.0\include
GLFW: E:\pg\code\220124 computer graphic\glfw-3.3.6\glfw-3.3.6\include
glm: E:\pg\code\220124 computer graphic\glm-0.9.8.0
SOIL2: E:\pg\code\220124 computer graphic\SOIL2-master\SOIL2-master\src
将所有文件复制完后的结构:
以上为 PDF 370 – PDF 374 的内容,是附录A的内容
调试pdf 29 页的程序
新建项目后,如何将现有文件夹加入vs项目中
参考教程:https://blog.csdn.net/weixin_44378800/article/details/106697612
如何将现有 lib 库导入项目,右键项目,选择“添加”-> 现有项,将 lib 导入
VS2017出现C4996 ‘fopen’: This function or variable may be unsafe. Consider using fopen_s instead.错误
参考教程:https://blog.csdn.net/qq_28114615/article/details/85683550
解决办法:
项目——属性——C/C++——预处理器——预处理器定义——右侧下拉框中“编辑”——在第一个编辑框中添加_CRT_SECURE_NO_WARNINGS——大功告成
错误“main 函数已经在main.obj 文件中定义过”,解决办法:右键选中 main, 选择“查找所有引用”,查到 dummy.cpp 文件中也有一个 main 函数定义,由于 dummy.cpp 文件中没有任何有用信息,所以更改 里面的mian 函数名称为 main_dummy,重新编译解决问题
编译报错,定义的 display 函数中调用了 glClearColor 和 glClear 函数,“无法解析的外部符号”,所以在项目属性中,配置属性 -> 链接器 -> 输入 -> 附加依赖项中,增加一个 OpenGL32.lib -> 确定 -> 确定
需要XXX.lib或XXX.dll库。手动添加,项目->属性->配置属性->链接器->输入 然后在附件依赖项添加XXX.lib,再生成第一个无法解析的外部符号错误消失了。
增加 OpenGL32.lib 附加依赖项之后,运行报错,vs运行时提示:应用程序无法正常启动(oxc000007b)。请单击"确定"关闭应用程序
打开生成的 “220126 template.exe”,位置是:
E:\pg\code\220124 computer graphic\220126 template\220126 template\Debug
这个exe 文件无法顺利打开,报错是“找不到 glew32.dll”
注意,这里是将 win32 文件夹中的 glew32.dll 放入电脑的 SysWOW64 文件夹中,也就是将32位的 dll 文件放入 系统对应存储64位的文件夹里。
就是从 E:\pg\code\220124 computer graphic\glew-2.1.0-win32\glew-2.1.0\bin\Release\Win32 文件夹中,复制 “glew32.dll” ,在C:\Windows\SysWOW64 文件夹中,粘贴刚刚复制的 dll 文件。
这样就可以顺利生成,结果如下:
分析2.1代码
#include "include\GL\glew.h"
#include "include\GLFW\glfw3.h"
#include <iostream>
using namespace std;
void init(GLFWwindow* window) { }
void display(GLFWwindow* window, double currentTime) {
glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
}
int main(void) {
if (!glfwInit()) { exit(EXIT_FAILURE); }
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
GLFWwindow* window = glfwCreateWindow(600, 600, "Chapter2 - program1", NULL, NULL);
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK) { exit(EXIT_FAILURE); }
glfwSwapInterval(1);
init(window);
while (!glfwWindowShouldClose(window)) {
display(window, glfwGetTime());
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwDestroyWindow(window);
glfwTerminate();
exit(EXIT_SUCCESS);
glClearColor(1.0, 0.0, 0.0, 1.0);
// 四个数 (1,0,0,1)是 RGBA的格式
GLFW
和 GLEW
库激活函数:
glfwInit()
glewInit()
glfwCreateWindow() :
用来创造 GLFW 窗口,长,宽,顶部的标题和 对应的内容
window hints 窗口提示:提示机制必须兼容 openGL 4.3,就是代码中的:
major = 4
minor = 3
glfwSwapInterval() and glfwSwapBuffers()
: 用来垂直同步?
glfwMakeContextCurrent() :
用来使得窗口的内容显示出来
display()
: 循环函数
glfwSwapBuffers()
: 涂屏幕窗口 paint the screen
glfwPollEvents()
: 对类似键盘被按下的事件做出反应
glfwGetTime()
: 返回GLFW 初始化的时间
glClear(GL_COLOR_BUFFER_BIT);
意思是,将颜色缓存器的颜色清理掉,重新提供预设好的颜色
glClearColor()
就是在清理颜色缓存器之前,要提供一个颜色,以便清理缓存器后提供
glfwDestroyWindow() and glfwTerminate()
结束这个窗口并停止
PDF31
补充知识点:
vs中,include 其他文件夹的头文件时候,需要用 双引号 而不是<>,同时,创建名为test的解决方案项目时候,有一个文件夹 test,里面有 test.sln 和 test 文件夹,需要引用的头文件在子文件夹 test 中,那么就写作 include “GL/xxx.h”,其中 GL文件夹就在 test 子文件夹中。