欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > > 文章正文

OpenGL学习笔记(2)-,opengl学习笔记

来源: javaer 分享于  点击 23044 次 点评:115

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安装好的话,应该可以直接用的。

相关文章

    暂无相关文章

用户点评