【OpenGL】Clion配置

OpenGL简介

OpenGL(Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。OpenGL是行业领域中最为广泛接纳的 2D/3D 图形 API,其自诞生至今已催生了各种计算机平台及设备上的数千优秀应用程序。

GLFW简介

GLFW(Graphics Library Framework),它是一个小型 C 库,允许使用 OpenGL 上下文创建和管理窗口,从而也可以使用多个监视器和视频模式。它同时提供对键盘、鼠标和操纵杆输入的访问。

GLAD简介

由于OpenGL驱动版本众多,大多数函数的位置都无法在编译时确定下来,需要在运行时进行查询,使得开发过程较为繁琐。GLAD (Multi-Language GL/GLES/EGL/GLX/WGL Loader-Generator based on the official specs) 是一个开源的库,可以提供一种更为简单的方法加载所有相关的OpenGL函数。

GLM简介

GLM(OpenGL Mathematics)是专门为OpenGL量身定做的数学库,它是一个只有头文件的库,可以快速实现矩阵变换等各种图形学中常用的几何计算。

三者的关系

OpenGL定义标准 → 显卡厂商编写驱动 → GLAD提供接口 → GLFW建立窗口

因为我喜欢也习惯了用clion写C++,所以还是决定配置clion的OpenGL环境

首先下载GLFW和glad这两个库

glad下载 

glad.dav1d.de

选择最新的版本

c9fd124ae10d46f3b9df495239825723.png

再点这个

ad552f4c4c29464fb438a8b0e2a4d747.png 下载压缩包

4f639b4e5b13495ba50fac7386ee8b07.png

GLFW下载

Download | GLFW

这个可能需要开一下,然后下对应电脑适配版本,我是Windows64,下这个64位的

7c943c6b2bea40798d2a3c1842f23961.png 完事之后打开Clion,创建一个新项目,就叫OpenGL吧,然后建立起三个目录,include,lib,src

fcb3e0e164ab49a38f63c5615f4250db.png

解压刚刚那两个文件夹,把GLFW的include文件夹下的GLFW文件夹放到刚刚Clion项目的新目录include下,然后把lib-mingw-w64文件夹下的glfw3.dll复制到新目录lib和目录cmake-build-debug下

把glad的include文件夹下的glad和KHR放到项目目录include下,src文件夹下的glad.c放到项目目录src下

96b3a7f31a614dedaf2bb3da8f27164b.png

然后修改CMakeList.txt,除了你的项目名称和cmake版本以及C++版本可以不一样,其他都需要修改成这个样子

cmake_minimum_required(VERSION 3.23)
project(OpenGL)set(CMAKE_CXX_STANDARD 14)add_executable(OpenGL main.cpp src/glad.c)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
link_directories(${PROJECT_SOURCE_DIR}/lib)
target_link_libraries(OpenGL ${PROJECT_SOURCE_DIR}/lib/glfw3.dll)

让gpt写个程序检验一下环境配置,因为我还是啥也不会的才寄,所以现在只能先让gpt来写一下

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <iostream>// 顶点着色器源码
const char* vertexShaderSource = R"(#version 330 corelayout (location = 0) in vec3 aPos;void main(){gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);}
)";// 片段着色器源码
const char* fragmentShaderSource = R"(#version 330 coreout vec4 FragColor;void main(){FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);}
)";int main()
{// 初始化GLFWglfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 创建一个窗口对象GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);// 初始化GLADif (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// 编译顶点着色器unsigned int vertexShader;vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);// 编译片段着色器unsigned int fragmentShader;fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);// 链接着色器程序unsigned int shaderProgram;shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// 删除着色器glDeleteShader(vertexShader);glDeleteShader(fragmentShader);// 设置顶点数据(这里我们只绘制一个三角形)float vertices[] = {0.5f,  0.5f, 0.0f,  // 右上角0.5f, -0.5f, 0.0f,  // 右下角-0.5f, -0.5f, 0.0f,  // 左下角};unsigned int VBO, VAO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);// 渲染循环while (!glfwWindowShouldClose(window)){glClear(GL_COLOR_BUFFER_BIT);glUseProgram(shaderProgram);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 3);glfwSwapBuffers(window);glfwPollEvents();}// 清理资源glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteProgram(shaderProgram);// 终止GLFWglfwTerminate();return 0;
}

居然可以跑,证明我们的clion配置成功了 

616cc778c90446cc8686a0a3ec4427ba.png

如果需要的话,还可以下载glm

Release GLM 0.9.8.0 · g-truc/glm (github.com)

下载后解压,把里面的glm文件夹,注意是下面这个,放到项目的include目录下

 

再让gpt先生给我们写一个用glad、glm和glfw画画的程序

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <iostream>
#include "glm/gtc/type_ptr.hpp"// 顶点着色器源码
const char* vertexShaderSource = R"(#version 330 corelayout (location = 0) in vec3 aPos;layout (location = 1) in vec3 aColor;uniform mat4 model;uniform mat4 view;uniform mat4 projection;out vec3 color;void main(){gl_Position = projection * view * model * vec4(aPos, 1.0);color = aColor;}
)";// 片段着色器源码
const char* fragmentShaderSource = R"(#version 330 corein vec3 color;out vec4 FragColor;void main(){FragColor = vec4(color, 1.0);}
)";int main()
{// 初始化GLFWglfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// 创建一个窗口对象GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);// 初始化GLADif (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// 编译顶点着色器unsigned int vertexShader;vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);// 编译片段着色器unsigned int fragmentShader;fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);// 链接着色器程序unsigned int shaderProgram;shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// 删除着色器glDeleteShader(vertexShader);glDeleteShader(fragmentShader);// 设置顶点数据(这里我们只绘制一个彩色的三角形)float vertices[] = {0.0f,  0.5f, 0.0f,   1.0f, 0.0f, 0.0f,  // 顶部顶点,红色-0.5f, -0.5f, 0.0f,   0.0f, 1.0f, 0.0f,  // 左下角顶点,绿色0.5f, -0.5f, 0.0f,   0.0f, 0.0f, 1.0f   // 右下角顶点,蓝色};unsigned int VBO, VAO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));glEnableVertexAttribArray(1);// 设置投影矩阵glm::mat4 projection = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f);// 渲染循环while (!glfwWindowShouldClose(window)){glClear(GL_COLOR_BUFFER_BIT);glUseProgram(shaderProgram);// 设置视图矩阵glm::mat4 view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f));// 设置模型矩阵glm::mat4 model = glm::mat4(1.0f);model = glm::rotate(model, (float)glfwGetTime(), glm::vec3(0.0f, 1.0f, 0.0f));// 设置着色器uniform变量unsigned int modelLoc = glGetUniformLocation(shaderProgram, "model");unsigned int viewLoc = glGetUniformLocation(shaderProgram, "view");unsigned int projectionLoc = glGetUniformLocation(shaderProgram, "projection");glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 3);glBindVertexArray(0);glfwSwapBuffers(window);glfwPollEvents();}// 清理资源glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteProgram(shaderProgram);// 终止GLFWglfwTerminate();return 0;
}

 多么好看,还会转

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/187656.shtml

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

相关文章

JVS低代码按钮组件触发逻辑,打破传统功能界限

在现代应用开发中&#xff0c;按钮组件的功能不仅仅局限于触发页面上的简单动作&#xff0c;它更可以成为连接前后端数据交互的桥梁。当按钮被点击时&#xff0c;其背后可能隐藏着复杂的逻辑远程调用过程&#xff0c;这些过程旨在从远程服务器获取数据&#xff0c;并将这些数据…

微信怎么设置自动回复

微信作为一款广受欢迎的社交媒体平台&#xff0c;其聊天功能是非常重要的。许多用户都希望能够快速、自动地回复消息 首先&#xff0c;点击设置&#xff0c;选择机器人下面的自动通过好友 点击新增规则&#xff0c;设置你自动通过好友的时间段&#xff0c;自动通过好友的微信工…

LeetCode Hot100 3.无重复字符的最长子串

题目&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 代码&#xff1a; class Solution {public int lengthOfLongestSubstring(String s) {char[] arr s.toCharArray(); // 转换成 char[] 加快效率&#xff08;忽略带来的空间…

文章解读与仿真程序复现思路——太阳能学报EI\CSCD\北大核心《基于电力CPS联合仿真的主配一体化电网负荷转供方法研究》

这个标题涉及到电力系统、CPS&#xff08;Cyber-Physical Systems&#xff0c;即网络化物理系统&#xff09;联合仿真&#xff0c;以及主配一体化电网负荷转供方法的研究。让我们逐步解读&#xff1a; 基于电力CPS联合仿真&#xff1a; 基于电力&#xff1a; 指的是该研究与电力…

python-nmap库使用教程(Nmap网络扫描器的Python接口)(功能:主机发现、端口扫描、操作系统识别等)

文章目录 Python-nmap库使用教程前置条件引入python-nmap创建Nmap扫描实例执行简单的主机发现&#xff08;nmap -sn&#xff09;示例&#xff0c;我有一台主机配置为不响应 ICMP 请求&#xff0c;但使用nmap -sn&#xff0c;仍然能够探测到设备&#xff1a; 端口扫描扫描特定端…

AIGC实战——生成对抗网络(Generative Adversarial Network)

AIGC实战——生成对抗网络 0. 前言1. 生成对抗网络1.1 生成对抗网络核心思想1.2 深度卷积生成对抗网络 2. 数据集分析3. 构建深度卷积生成对抗网络3.1 判别器3.2 生成器3.3 DCGAN 模型训练 4. GAN 训练技巧4.1 判别器强于生成器4.2 生成器强于判别器4.3 信息量不足4.4 超参数 小…

数据结构与算法之美学习笔记:29 | 堆的应用:如何快速获取到Top 10最热门的搜索关键词?

目录 前言堆的应用一&#xff1a;优先级队列堆的应用二&#xff1a;利用堆求 Top K堆的应用三&#xff1a;利用堆求中位数解答开篇内容小结 前言 本节课程思维导图&#xff1a; 搜索引擎的热门搜索排行榜功能你用过吗&#xff1f;搜索引擎每天会接收大量的用户搜索请求&#x…

HTML5+CSS3+JS小实例:数字滑动选择控件

实例:数字滑动选择控件 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

IPtables防火墙详解

一、IPtables介绍 iptables是unix/linux自带的一款开放源代码的完全自由的基于包过滤(对OSI模型的四层或者是四层以下进行过滤)的防火墙工具&#xff0c;它的功能十分强大&#xff0c;使用非常灵活&#xff0c;可以对流入和流出服务器的数据包进行很精细的控制。主要针对网络访…

最全最详细ChatGPT角色预设词教程,Prompt分享

使用指南 1、可直复制使用 2、可以前往已经添加好Prompt预设的AI系统测试使用&#xff08;可自定义添加使用&#xff09; 雅思写作考官 我希望你假定自己是雅思写作考官&#xff0c;根据雅思评判标准&#xff0c;按我给你的雅思考题和对应答案给我评分&#xff0c;并且按照雅…

开会做笔记的时候用什么软件比较好?

在工作生涯中&#xff0c;会经历很多大大小小的会议&#xff0c;而如何快速准确记录下会议上重要的内容&#xff0c;成了很多上班族的必修课。在会上做笔记&#xff0c;选择什么样的工具才能事半功倍&#xff0c;成了一个值得深思的问题。而经过一段时间的测评后&#xff0c;我…

Postman:专业API测试工具,提升Mac用户体验

如果你是一名开发人员或测试工程师&#xff0c;那么你一定知道Postman。这是一个广泛使用的API测试工具&#xff0c;适用于Windows、Mac和Linux系统。今天&#xff0c;我们要重点介绍Postman的Mac版本&#xff0c;以及为什么它是你进行API测试的理想选择。 一、强大的功能和易…

在 AlmaLinux9 上安装Oracle Database 23c

在 AlmaLinux9 上安装Oracle Database 23c 0. 下载 Oracle Database 23c 安装文件1. 安装 Oracle Database 23c3. 连接 Oracle Database 23c4. &#xff08;谨慎&#xff09;卸载 Oracle Database 23c 0. 下载 Oracle Database 23c 安装文件 版权问题&#xff0c;下载地址请等待…

工单派单管理系统有什么用?企业如何提升生产效率与产品质量?

在当今竞争激烈的市场环境中&#xff0c;企业需要一个高效、精准的管理工具来提升生产制造的效率和品质。工单派单管理系统正是这样一种工具&#xff0c;能够实现生产计划、任务分配、进度追踪、工时掌控等环节的优化&#xff0c;提高整体生产运营的效率和精度。 一、工单生成 …

Pycharm 初学者使用教程Ⅰ

目录 1. 下载 Pycharm2. 安装 Pycharm3.打开 Pycharm4.初始化配置界面ProjectsCustomizePluginsLearn 关联博文 1. 下载 Pycharm 下载链接&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows 在下载链接网页中&#xff0c;首先看到的是PyCharm Profes…

计算机网络(二)

&#xff08;八&#xff09;客户端软件设计的细节 A、解析协议号 客户端可能会需要通过协议名指定协议&#xff0c;但是Socket接口是用协议号指定的&#xff0c;这时候我们就需要使用getprotobyname()函数实现协议名到协议号的转换&#xff0c;该函数会返回一个指向protoent的…

【开源威胁情报挖掘2】开源威胁情报融合评价

基于开源信息平台的威胁情报挖掘综述 写在最前面4 开源威胁情报融合评价开源威胁情报的特征与挑战4.1 开源威胁情报数据融合融合处理方法 4.1 开源威胁情报的质量评价4.1.1 一致性分析本体的定义与组成本体构建的层次 4.1.2 去伪去重4.1.3 数据融合分析 4.2 开源威胁情报质量及…

[SWPUCTF 2021 新生赛]PseudoProtocols

题目很明确了就是伪协议 php://filter/convert.base64-encode/resourcehint.php 提交的伪协议的内容需要是 I want flag&#xff0c;就会echo flag 方法1&#xff1a;adata://text/plain,I want flag 方法2&#xff1a;adata://text/plain;base64,SSB3YW50IGZsYWc

KAO2 入门到熟练 看这一篇文章就够了

KOA 介绍 官网地址&#xff1a; https://koa.bootcss.com/ Koa 是一个新的 web 框架&#xff0c;由 Express 幕后的原班人马打造&#xff0c; 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数&#xff0c;Koa 帮你丢弃回调…

万字解析设计模式之策略模式、命令模式

一、策略模式 1.1概述 先看下面的图片&#xff0c;我们去旅游选择出行模式有很多种&#xff0c;可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 策略模式&#xff08;Strategy Pattern&#xff09;是一个行为型设计模式&#xff0c;它定义了一组算法家族&#xff0c;分…