CMake创建跨平台OPenGL工程(学习笔记)

一、跨平台环境基本配置

1、环境搭建

1)linux OpenGL环境搭建参考:ubuntu18.04 OpenGL开发(显示YUV)_ubuntu opengl-CSDN博客

https://blog.51cto.com/cerana/6433535

2)windows下环境搭建

OpenGL+Visual Studio2022+GLFW+glad详细配置教程_给vs配置glfw和glad-CSDN博客

2、创建cmake

    这里测试使用的图形界面使用QT。其中路径后面讲解

    主要有几个注意事项:

1)linux下需要添加

 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-error=register")

2)windows下需要设置vitual studio

set(LIBRARY_GLFW_PATH "${PROJECT_SOURCE_DIR}/lib-vc2022")

cmake_minimum_required(VERSION 3.5)SET(TARGET "QTGL")project(${TARGET} VERSION 0.1 LANGUAGES CXX)set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)if(WIN32)
else()set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-error=register")
endif()set(QTGL_GLAPI_PATH "${PROJECT_SOURCE_DIR}/GLAPI")
set(GLAD_FOLDER_INCLUDE_PATH "${PROJECT_SOURCE_DIR}/glad/include")
set(GLAD_FOLDER_SOURCE_PATH  "${PROJECT_SOURCE_DIR}/glad/src")
set(GLM_FOLDER_INCLUDE_PATH  "${PROJECT_SOURCE_DIR}/glm")
set(GLFW_FOLDER_INCLUDE_PATH  "${QTGL_GLAPI_PATH}/glfw")if(WIN32)set(LIBRARY_GLFW_PATH "${PROJECT_SOURCE_DIR}/lib-vc2022")LINK_DIRECTORIES("${LIBRARY_GLFW_PATH}")
endif()include_directories(${QTGL_GLAPI_PATH})
include_directories(${GLAD_FOLDER_INCLUDE_PATH})
include_directories(${GLM_FOLDER_INCLUDE_PATH})
include_directories(${GLFW_FOLDER_INCLUDE_PATH})file(GLOB GLAPI_HEADERS "${QTGL_GLAPI_PATH}/*.h")
source_group("GLAPI/include" FILES ${GLAPI_HEADERS})file(GLOB GLAPI_SOURCES "${QTGL_GLAPI_PATH}/*.cpp")
source_group("GLAPI/source" FILES ${GLAPI_SOURCES})file(GLOB_RECURSE GLAD_INCLUDE "${GLAD_FOLDER_INCLUDE_PATH}/*.*")
source_group("glad/include" FILES ${GLAD_INCLUDE})file(GLOB GLAD_SOURCE "${GLAD_FOLDER_SOURCE_PATH}/*.*")
source_group("glad/src" FILES ${GLAD_SOURCE})SET(QTUI_PATH "${PROJECT_SOURCE_DIR}/QTUI")file(GLOB_RECURSE QTUI_FILES "${QTUI_PATH}/*.*")
source_group("QTUI" FILES ${QTUI_FILES})set(ALL_SOURCES${GLAPI_HEADERS}${GLAPI_SOURCES}${GLAD_INCLUDE}${GLAD_SOURCE}${QTUI_FILES}
)ADD_EXECUTABLE(${TARGET} WIN32 ${ALL_SOURCES})find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)target_link_libraries(${TARGET} PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)if(WIN32)target_link_libraries(${TARGET} PRIVATE debug "${LIBRARY_GLFW_PATH}/glfw3.lib" optimized "${LIBRARY_GLFW_PATH}/glfw3.lib")target_link_libraries(${TARGET} PRIVATE debug "${LIBRARY_GLFW_PATH}/glfw3_mt.lib" optimized "${LIBRARY_GLFW_PATH}/glfw3_mt.lib")target_link_libraries(${TARGET} PRIVATE debug "${LIBRARY_GLFW_PATH}/glfw3dll.lib" optimized "${LIBRARY_GLFW_PATH}/glfw3dll.lib")
else()target_link_libraries(${TARGET} PRIVATE glfw3)target_link_libraries(${TARGET} PRIVATE GL)target_link_libraries(${TARGET} PRIVATE X11)target_link_libraries(${TARGET} PRIVATE m)target_link_libraries(${TARGET} PRIVATE pthread)target_link_libraries(${TARGET} PRIVATE dl)
endif()

3、第三方库文件

1)glad和glm

glad下载:https://glad.dav1d.de/,下载后得到glad.zip

把glad整个文件夹放置到工程目录下,然后,把src下的glad.c改为glad.cpp。

把glm整个文件夹放置到工程目录下,不需要额外的修改。

2)glfw

glfw下载,Download | GLFW

windows下,需要将编译好的glfw库放置到工程下。如图:

 3)整体工程结构如图:

4、QT界面文件QTUI

创建一个QDialog或者QMainWindow,带有.ui文件,可以使用uic指令将其转换为.h文件。

二、OPENGL 简单示例

1、初始化工程

1)初始化glfw,具体解释看:OpenGL学习(一) 绘制一个三角形 - 简书

int DrawApi::initialGlfw()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// glad: load all OpenGL function pointersreturn 0;
}

2)创建窗口:

int DrawApi::createWindow(string windowName, OUT GLFWwindow*& window)
{// glfw window creation// --------------------window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, windowName.c_str(), NULL, NULL);if (window == NULL){glfwTerminate();return -1;}glfwMakeContextCurrent(window);// ---------------------------------------if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){cout << "Failed to initialize GLAD" << endl;return -1;}glViewport(0, 0, 800, 800);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);  // 窗体能够根据拉动变化return 0;
}

3)顶点着色器

int DrawApi::createVertexShader(OUT GLuint& vertexShader, const char* vertexShaderSource)
{//1.初始化着色器//创建一个着色器类型vertexShader = glCreateShader(GL_VERTEX_SHADER);//把代码复制进着色器中glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);//编译顶点着色器glCompileShader(vertexShader);int success;char infoLog[512];glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);//判断是否编译成功if (!success) {glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);cout << "error when vertex compile:" << infoLog << endl;return -1;}return 0;
}

4)片元着色器

int DrawApi::createFragmentShader(OUT GLuint& fragmentShader, const char* fragmentShaderSource)
{fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);int success;char infoLog[512];glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);//判断是否编译成功if (!success) {glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);cout << "error when fragment compile:" << infoLog << endl;return -1;}return 0;
}

5)编译程序

int DrawApi::createProgram(GLuint& vertexShader, GLuint& fragmentShader, OUT GLuint& shaderProgram)
{//链接,创建一个程序shaderProgram = glCreateProgram();//链接上共享库glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);//链接glLinkProgram(shaderProgram);int success;char infoLog[512];glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);cout << "error when link compile:" << infoLog << endl;return -1;}glDeleteShader(vertexShader);glDeleteShader(fragmentShader);return 0;
}

6)绘制三角形

int DrawApi::drawTriangles(const vector<vector<float>>& triangelValues)
{//1.会先绑定顶点//2.绑定缓冲区//3.接着把顶点输入到顶点缓冲去中//4.把缓冲区的数据传送到着色器中//5.输出到屏幕。if (initialGlfw() < 0)return -1;GLFWwindow* window = nullptr;if (createWindow("learnOpenGL", window) < 0)return -2;GLuint vertexShader;if (createVertexShader(vertexShader, VERTEX_SHADER) < 0)return -3;GLuint fragmentShader;if (createFragmentShader(fragmentShader, FRAGMENT_SHADER) < 0)return -4;GLuint shaderProgram;if (createProgram(vertexShader, fragmentShader, shaderProgram) < 0)return -5;if (triangelValues.size() == 0)return -6;if (triangelValues.size() > 1256)return -7;float vertices[4096] = {0};for (int i = 0; i < triangelValues.size(); i++){for (int j = 0; j < 3; j++){vertices[3 * i + j] = triangelValues[i][j];}}GLuint VAO;// 生成分配VAOglGenVertexArrays(1, &VAO);// 绑定VAO,注意在core模式,没有绑定VAO,opengl拒绝绘制任何东西glBindVertexArray(VAO);GLuint VBO;// 生成一个VBO缓存对象glGenBuffers(1, &VBO);// 绑定VBOglBindBuffer(GL_ARRAY_BUFFER, VBO);// 类型为GL_ARRAY_BUFFER 第二第三参数说明要放入缓存的多少,GL_STATIC_DRAW当画面不动的时候推荐使用glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);// render loop// -----------while (!glfwWindowShouldClose(window)){// inputprocessInput(window);// renderglClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);glUseProgram(shaderProgram);//绑定数据glBindVertexArray(VAO);//绘制一个三角形//从0开始,3个glDrawArrays(GL_TRIANGLES, 0, triangelValues.size() * 3);glBindVertexArray(0);// glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)// -------------------------------------------------------------------------------glfwSwapBuffers(window);glfwPollEvents();}glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);// glfw: terminate, clearing all previously allocated GLFW resources.// ------------------------------------------------------------------glfwTerminate();return 0;
}

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

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

相关文章

【Linux系统】进程控制

再次理解进程 进程&#xff1a;内核的相关管理数据结构(task_struct(进程控制块PCB)&#xff0c;mm_struct(地址空间)&#xff0c;页表) 代码和数据 那么如何理解进程具有独立性&#xff1f; 我们之前已经学习过进程控制块啊&#xff0c;地址空间啊&#xff0c;页表啊&…

GitHub Actions 手动触发方式

目录 前言 Star Webhook 手动触发按钮 前言 GitHub Actions 是 Microsoft 收购 GitHub 后推荐的一款 CI/​CD 工具早期可能是处于初级开发阶段&#xff0c;它的功能非常原生&#xff0c;甚至没有直接提供一个手动触发按钮一般的触发方式为代码变动&#xff08;push 、pull…

【2024版】最新6款漏洞扫描工具来了!(附下载)看完这一篇就够了

目录 一、Nessus 二、AWVS 三、ZAP 四、w3af 五、北极熊 六、御剑 七、网络安全学习路线 &#xff08;2024最新整理&#xff09; 八、学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明&#xff1a; 渗透测试收集信息完成后&#xf…

每日两题 / 104. 二叉树的最大深度 102. 二叉树的层序遍历(LeetCode热题100)

104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 递归判断&#xff0c;当前节点的最大深度为1 max(左节点的最大深度&#xff0c;右节点的最大深度) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

Ansible---inventory 主机清单

一、inventory 主机清单 1.1、inventory介绍 hosts配置文件位置&#xff1a;/etc/ansible/hosts Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内。 1.2、inventory中的变量 Inventory变量名含义…

八、VUE内置指令

一、初识VUE 二、再识VUE-MVVM 三、VUE数据代理 四、VUE事件处理 五、VUE计算属性 六、Vue监视属性 七、VUE过滤器 七、VUE内置指令 九、VUE组件 v-text 向其所在的节点中渲染文本内容。 (纯文本渲染)与插值语法的区别&#xff1a;v-text会替换掉节点中的内容&#xff0c;{{x…

springboot3项目练习详细步骤(第一部分:用户业务模块)

目录 环境准备 用户模块 注册 注册接口文档 ​编辑 实现结构 Spring Validation 登录 登录的接口文档 实现登录逻辑 JWT令牌 完善登录认证 拦截器 获取用户详细信息 接口文档 Usercontroller类中编写方法接口 忽略属性返回 优化代码ThreadLocal 更新用户基本信…

ubuntu启动修复(BIOS无法找到GRUB | 引导加载器)

Ubuntu启动修复&#xff08;无法找到GRUB|引导加载器&#xff09; 问题&#xff1a; 笔者的一台双系统主机&#xff0c;里面有两个硬盘&#xff0c;1T的硬盘装的是windows系统&#xff0c;2T硬盘装的是ubuntu20.04系统。因为长期使用ubuntu系统&#xff0c;所以选择格式化了1T…

Adobe Premiere Pro安装

一、安装包下载 链接&#xff1a;https://pan.baidu.com/s/1aYqTSQQutDguKYZE-yNHiw?pwd72l8 提取码&#xff1a;72l8 二、安装步骤 1.鼠标右击【Pr2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 Pr2024(64bit)】。 2.打开…

【计算机毕设】小型企业办公自动化系统+vue - 免费源码(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本项目旨在设计并实现一个小型企业办公自动化系统&#xff0c;利用Vue作为前端框架&#xff0c;为企业员工提供便捷的办公管理工具&#xff0c;提升…

mysql数据库调优篇章1

目录 1.认识数据库中日志的作用2.增加mysql数据库中my.ini 基本配置3.增加my.ini中参数配置4.查看已经执行过的sql语句过去执行时间5.找出慢查询的sql6. SHOW VARIABLES LIKE ‘innodb_read_io_threads’; SHOW VARIABLES LIKE ‘innodb_write_io_threads’; SHOW VARIABLES LI…

ArthasGC日志GCeasy详解

Arthas详解 Arthas是阿里巴巴在2018年9月开源的Java诊断工具,支持JDK6,采用命令行交互模式,可以方便定位和诊断线上程序运行问题.Arthas官方文档十分详细.详见:官方文档 Arthas使用场景 Arthas使用 # github下载arthas wget https://alibaba.github.io/arthas/arthas-boot.j…

了解tensorflow.js

1、浏览器中进行机器学习的优势 浏览器中进行机器学习&#xff0c;相对比与服务器端来讲&#xff0c;将拥有以下四大优势&#xff1a; 不需要安装软件或驱动&#xff08;打开浏览器即可使用&#xff09;&#xff1b;可以通过浏览器进行更加方便的人机交互&#xff1b;可以通过…

智慧手术室手麻系统源码,C#手术麻醉临床信息系统源码,符合三级甲等医院评审要求

手麻系统全套源码&#xff0c;C#手术麻醉系统源码&#xff0c;支持二次开发&#xff0c;授权后可商用。 手术麻醉临床信息系统功能符合三级甲等医院评审要求&#xff0c;实现与医院现有信息系统如HIS、LIS、PACS、EMR等系统全面对接&#xff0c;全面覆盖从患者入院&#xff0c;…

前端css中径向渐变(radial-gradient)的使用

前端css中径向渐变的使用 一、前言二、主要内容说明&#xff08;一&#xff09;、径向渐变的形状1.椭圆形渐变&#xff08;ellipse&#xff09;&#xff0c;源码12.源码1运行效果3.圆形渐变&#xff08;circle&#xff09;&#xff0c;源码24.源码2运行效果 &#xff08;二&…

C++青少年简明教程:C++程序结构

C青少年简明教程&#xff1a;C程序结构 一个简单的C程序源码如下&#xff1a; #include <iostream> using namespace std;int main() {cout << "Hello World" << endl;return 0; }下面解析一下。 1. #include <iostream> 这行代码的意思…

Python包管理工具

1、python包管理 在java开发生态&#xff0c;我们早已习惯使用maven或者gradle来构建和管理java项目。通过构建工具&#xff0c;我们可以非常方便对项目的依赖、打包、部署等进行管理&#xff0c;极大的减少手工操作的复杂性。 如果使用python开发生态&#xff0c;我们同样可…

k8s概述及核心组件

一、k8s概述 1.1 引言 docker compose 单机编排工具 有企业在用 docker swarm 能够在多台主机中构建一个docker集群 基本淘汰集群化管理处理工具 容器 微服务封装 dockerfile 编写成镜像 然后进行发布 dockerfile 可以写成shell脚本&#xff08;函数做调…

Kafka应用Demo:指派分区订阅消息消费

环境准备 Kafka环境搭建和生产者样例代码与《Kafka应用Demo&#xff1a;按主题订阅消费消息》相同。 消费者代码样例 public class KafkaConsumerService {private static final Logger LOGGER LoggerFactory.getLogger(KafkaConsumerService.class);private static final S…

【DFT】高 K/金属栅极阈值电压偏移的密度泛函模型

文章《Density functional model of threshold voltage shifts at High-K/Metal gates》&#xff0c;是由R. Cao、Z. Zhang、Y. Guo、J. Robertson等人撰写&#xff0c;发表在《Solid-State Electronics》期刊上。通过密度泛函理论&#xff08;Density Functional Theory, DFT&…