OpenGL学习笔记(2)-,opengl学习笔记
OpenGL学习笔记(2)-,opengl学习笔记
引言
本文讲述了笔者在VScode中配置openGL开发环境的和初步使用openGL的过程。因为实在是讨厌VS的笨重和codeblocks界面的丑陋,所以花了一整天的时间成功地在VScode上配置了openGL的开发环境。其实是想玩玩VScode,自己建一个小小的工程试试。
VScode中C++环境的配置
该过程主要是参考知乎上 “Visual Studio Code如何编写运行C、C++?” 中谭九鼎的答案。
照着做就可以了,配置完成后就可以在VScode编译和调试单个的C++程序。
OpenGL的配置
OpenGL用的是GLFW和GLAD搭配,主要参考的链接。
GLFW
GLFW是一个专门针对OpenGL的C语言库,能够提供给一个窗口和上下文用来渲染,节省书写操作系统相关代码的时间。
首先去GLFW官网下载,我下载的是针对windows预先编译好的二进制文件。(之前按照教程走了很多弯路)。在工程目录下新建文件夹openGL,在openGL中再新建一个include文件夹和libs文件夹。把GLFW解压出来的文件夹中的include文件夹下的GLFW文件夹直接拷贝到之前新建的include文件夹中,把lib-mingw-w64文件夹下的三个文件拷贝到libs文件夹中。
GLAD
按照链接里的步骤下载下来GLAD的压缩包,通过gcc将glad.c文件编译成静态库文件libglad.a,把头文件放在工程的include中,将libglad.a放到libs文件夹里。
编译的设置
改变之前配置C++环境的那四个文件
tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "Compile", // 任务名称,与launch.json的preLaunchTask相对应
"command": "clang++", // 要使用的编译器
"args": [
"${file}",
"-o", // 指定输出文件名,不加该参数则默认输出a.exe,Linux下默认a.out
"${fileDirname}/${fileBasenameNoExtension}.exe",
"-g", // 生成和调试有关的信息
"-Wall", // 开启额外警告
"-static-libgcc", // 静态链接
"-fcolor-diagnostics", // 彩色的错误信息?但貌似clang默认开启而gcc不接受此参数
"--target=x86_64-w64-mingw", // clang的默认target为msvc,不加这一条就会找不到头文件;Linux下去掉这一条
"-std=c++17", // C语言最新标准为c11,或根据自己的需要进行修改
"-I${fileDirname}/openGL/include",
"-L${fileDirname}/openGL/libs",
"-lglad",
"-lglfw3",
"-lglfw3dll"
], // 编译命令参数
"type": "shell", // 可以为shell或process,前者相当于先打开shell再输入命令,后者是直接运行命令
"group": {
"kind": "build",
"isDefault": true // 设为false可做到一个tasks.json配置多个编译指令,需要自己修改本文件,我这里不多提
},
"presentation": {
"echo": true,
"reveal": "always", // 在“终端”中显示编译信息的策略,可以为always,silent,never。具体参见VSC的文档
"focus": false, // 设为true后可以使执行task时焦点聚集在终端,但对编译c和c++来说,设为true没有意义
"panel": "shared" // 不同的文件的编译信息共享一个终端面板
}
// "problemMatcher":"$gcc" // 如果你不使用clang,去掉前面的注释符,并在上一条之后加个逗号。照着我的教程做的不需要改(也可以把这行删去)
}
]
}
主要是添加了编译时头文件的路径,和链接时库文件的链接。这个地方卡了我好久,主要是只链接了libglfw3.a和libglad.a,编译就一直报错,然后把libglfw3dll.a也加进链接里就通过。之后还有一步留到下面说。
这四个文件可以参考我的github
使用OpenGL
这个时候在你的文件里就可以引用库文件了
#define GLFW_DLL
#include <glad/glad.h>
#include <GLFW/glfw3.h>
这里有两点要注意,glad一定要在GLFW之前,前面宏的定义不能删。(参照链接中”With MinGW or Visual C++ on Windows“的部分)
下面就是按照教程写你的openGL程序了,下面是我的代码
#define GLFW_DLL
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <stdlib.h>
// 注意 glad的引用一定要在GLFW之前
using namespace std;
// 窗口大小改变时的回调函数
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
// 输入控制
void processInput(GLFWwindow *window)
{
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
int main()
{
// 初始glfw,设置版本号为3.3,使用核心模式,应用设置
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
// 创建一个窗口,将窗口的上下文应用到当前的主上下文
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
cout << "Failed to create GLFW window" << endl;
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
// 初始化GLAD
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
cout << "Failed to initialize GLAD" << endl;
return -1;
}
// 初始化渲染窗口,及视口ViewPort
glViewport(0, 0, 800, 600);
// 绑定回调函数
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
// 准备引擎
// 循环不停的渲染,及渲染循环
while(!glfwWindowShouldClose(window)){
// 检查用户的输入
processInput(window);
// 渲染指令
// 清空颜色
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
// 检查触发事件
glfwPollEvents();
// 应用程序采用着双缓冲模式,一张在前面显示,一张在后面慢慢加载
// Swap交换缓冲,完成立刻刷新
glfwSwapBuffers(window);
}
// 释放glfw的资源
glfwTerminate();
return 0;
}
按F5编译成功,但是运行出错,提示缺少dll文件,把lib里的glfw3.dll移到当前目录就可以运行了。
比较懒的可以直接下载我的工程源码,如果你的mingw和clang安装好的话,应该可以直接用的。
相关文章
- 暂无相关文章
用户点评