Dear ImGui结合CMake实现基于GLFW和OpenGL3的入门级hello world代码

news2024/11/23 10:44:34

Dear ImGui结合CMake实现基于GLFW和OpenGL3的入门级hello world代码

如需转载请标明出处:https://blog.csdn.net/itas109
技术交流:129518033

环境:

OS: windows 10 / Ubuntu 22.04
imgui: 1.89.5
glw: 3.3.8

前言

Dear ImGui 是一个 用于C ++的无膨胀图形用户界面库。它输出优化的顶点缓冲区,您可以随时在启用3D管线的应用程序中进行渲染。 它快速,可移植,与渲染器无关并且是独立的(无外部依赖性)。

Dear Imgui是一个非常轻量级的库,没有额外的外部依赖,支持跨平台,很适合用于游戏引擎。

官方网站:https://github.com/ocornut/imgui

官方维护的后端:

渲染器:DirectX9,DirectX10,DirectX11,DirectX12,OpenGL,OpenGL3/ES/ES2,Vulkan,Metal
平台:GLFW,SDL2,Win32,Glut,OSX
框架:Emscripten,Allegro5,Marmalade

1. 下载ImGui代码及其依赖

这里我们使用GLFW3和OpenGL3进行渲染。

  • ImGui 1.89.5

https://github.com/ocornut/imgui/archive/refs/tags/v1.89.5.tar.gz

  • glw 3.3.8

https://github.com/glfw/glfw/archive/refs/tags/3.3.8.tar.gz

2. hello world代码

目录结构

imgui-1.89.5
$ tree
.
|-- CMakeLists.txt # my
|-- glfw-3.3.8.tar.gz # my
|-- main.cpp # my
...
|-- imconfig.h
|-- imgui.cpp
|-- imgui.h
|-- imgui.ini
|-- imgui_demo.cpp
|-- imgui_draw.cpp
|-- imgui_internal.h
|-- imgui_tables.cpp
|-- imgui_widgets.cpp
|-- imstb_rectpack.h
|-- imstb_textedit.h
|-- imstb_truetype.h
...

main.cpp

// Dear ImGui: standalone example application for GLFW + OpenGL3

#include "imgui.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_opengl3.h"

#include <GLFW/glfw3.h> // Will drag system OpenGL headers

// Main code
int main(int, char**)
{
    if (!glfwInit())
        return 1;

    // GL 3.0 + GLSL 130
    const char* glsl_version = "#version 130";

    // Create window with graphics context
    GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL3", nullptr, nullptr);
    if (window == nullptr)
        return 1;
    glfwMakeContextCurrent(window);
    glfwSwapInterval(1); // Enable vsync

    // Setup Dear ImGui context
    ImGui::CreateContext();

    // Setup Platform/Renderer backends
    ImGui_ImplGlfw_InitForOpenGL(window, true);
    ImGui_ImplOpenGL3_Init(glsl_version);

    // Main loop
    while (!glfwWindowShouldClose(window))
    {
        // Poll and handle events (inputs, window resize, etc.)
        glfwPollEvents();

        // Start the Dear ImGui frame
        ImGui_ImplOpenGL3_NewFrame();
        ImGui_ImplGlfw_NewFrame();
        ImGui::NewFrame();

        // ************ GUI **************
        ImGui::Begin("hello world");
        ImGui::Text("hello world");
        ImGui::End();
        // ************ GUI **************

        // Rendering
        ImGui::Render();
        int display_w, display_h;
        glfwGetFramebufferSize(window, &display_w, &display_h);
        glViewport(0, 0, display_w, display_h);

        static ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
        glClearColor(clear_color.x * clear_color.w, clear_color.y * clear_color.w, clear_color.z * clear_color.w, clear_color.w);
        glClear(GL_COLOR_BUFFER_BIT);
        ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());

        glfwSwapBuffers(window);
    }

    // Cleanup
    ImGui_ImplOpenGL3_Shutdown();
    ImGui_ImplGlfw_Shutdown();
    ImGui::DestroyContext();

    glfwDestroyWindow(window);
    glfwTerminate();

    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.11.0)

project(main)

include_directories(.)
include_directories(backends)

set(IMGUI_FILES 
imgui.cpp 
imgui_draw.cpp 
imgui_tables.cpp 
imgui_widgets.cpp 
backends/imgui_impl_glfw.cpp # platform
backends/imgui_impl_opengl3.cpp # render
)

include(FetchContent)
# cmake 3.11 above
FetchContent_Declare(glfw URL ${CMAKE_CURRENT_SOURCE_DIR}/glfw-3.3.8.tar.gz)
FetchContent_GetProperties(glfw)
if(NOT glfw_POPULATED)
  # Fetch the content using previously declared details
  FetchContent_Populate(glfw)
  
  # Set custom variables
  set(BUILD_SHARED_LIBS OFF)
  set(GLFW_BUILD_EXAMPLES OFF)
  set(GLFW_BUILD_TESTS OFF)
  set(GLFW_BUILD_DOCS OFF)
  set(GLFW_INSTALL OFF)
  set(GLFW_VULKAN_STATIC OFF)

  # Bring the populated content into the build
  add_subdirectory(${glfw_SOURCE_DIR} ${glfw_BINARY_DIR})
endif()

add_executable(${PROJECT_NAME} main.cpp ${IMGUI_FILES})

if(WIN32)
target_link_libraries(${PROJECT_NAME} opengl32 glfw)
else()
target_link_libraries(${PROJECT_NAME} GL glfw)
endif()

3. 结果

  • windows
    在这里插入图片描述
  • ubuntu
    在这里插入图片描述

License

License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎

如需转载请标明出处:https://blog.csdn.net/itas109
技术交流:129518033


Reference:
NULL

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

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

相关文章

alibaba arthas的新人上手教程

背景 Arthas 是Alibaba开源的Java诊断工具。 github开源地址&#xff1a;GitHub - alibaba/arthas: Alibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas 上手教程 1.下载arthas&#xff0c;并测试运行demo curl -O https://arthas.aliyun.com/arthas-boot.j…

高防IP的定义与作用

随着网络技术的发展&#xff0c;网络攻击的频率和威力不断升级&#xff0c;对企业和个人的网络安全造成了巨大风险。于是&#xff0c;高防IP作为一种网络安全防护工具应运而生&#xff0c;成为广大用户保障网络安全的重要手段。接下来让我们一起来详细了解下高防IP的定义和作用…

web实验(1)

&#xff08;1&#xff09; 应用html和css完成如图所示界面效果。内容相对于浏览器居中&#xff0c;图标见附件disc.jpg。 说明&#xff1a; 内容相对于浏览器居中&#xff0c;图标见附件disc.jpg盒子边框1px solid #ccc&#xff0c;内边距20px文本字体颜色#122e67&#xff…

outlook邮箱pc/mac客户端下载 含最新版

新的 Outlook for Windows or mac 为 Outlook 应用带来了最新功能、智能辅助功能和新的新式简化设计。 你可以根据自己的风格定制它&#xff0c;并使用新的 Outlook for Windows/mac 执行更多操作&#xff01; 览版&#xff0c;与我们一起开始旅程&#xff0c;并帮助我们塑造新…

SSM整合完整流程

&#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某公司实习&#x1f…

Django--DRf---序列化器:序列化器嵌套

模型表&#xff1a; from django.db import models# Create your models here.class StudentModel(models.Model):id models.AutoField(primary_keyTrue)name models.CharField(max_length32,verbose_name姓名)age models.SmallIntegerField(verbose_name年龄)class_mate_f…

人人可用的开源数据可视化分析工具-DataEase

DataEase 介绍 DataEase是一种开源的关系型数据库管理系统&#xff0c;旨在帮助用户创建和管理各种类型的数据。它是一种易于使用的工具&#xff0c;适用于各种规模的企业和组织&#xff0c;从个人使用到大型公司使用。 Github 地址&#xff1a;GitHub - dataease/dataease: …

2023年4月份上新的Transformer模型设计系列论文(附下载链接)

来源&#xff1a;投稿 作者&#xff1a;王老师 编辑&#xff1a;学姐 论文1 论文标题&#xff1a; Slide-Transformer: Hierarchical Vision Transformer with Local Self-Attention** 滑动Transformer&#xff1a;具有局部自注意的分层视觉Transformer 论文链接&#xff1a;h…

ChatGPT 克隆方案,开源了!开箱即用

什么是 ChatGPT ChatGPT是一种基于人工智能技术的大型语言模型&#xff0c;它能够理解和处理人类自然语言&#xff0c;并且在回答问题、生成文本和模拟对话等方面表现出色。ChatGPT使用的是GPT-3.5架构&#xff0c;它在训练过程中接触了大量的语言数据&#xff0c;并利用这些数…

机器学习算法系列(四)-- 决策树

机器学习算法之–决策树 最经典的机器学习模型之一&#xff0c;成树型结构&#xff0c;决策树的目的是为了产生一颗泛化能力强&#xff0c;处理未见实例能力强的树&#xff0c;通过特征判断不断分类&#xff0c;基本流程遵循“分而治之”的递归分类策略。 一、算法原理 1.1、特…

《C++程序设计原理与实践》笔记 第17章 向量和自由空间

本章和后面四章介绍C标准库的容器和算法部分&#xff08;通常称为STL&#xff09;。本章和后面两张的重点是最常用、最有用的STL容器——向量的设计和实现。 17.1 引言 C标准库中最有用的容器是vector。vector提供了给定类型的元素序列。标准库vector是一个方便、灵活、&…

Redis从零上手

文章目录 NoSQL概述互联网发展史单机MySQL的年代&#xff08;90年代&#xff09;缓存时代: Memcached MySQL 垂直拆分(读写分离)分库分表 水平拆分(MySQL集群)如今最近的年代 为什么要用NoSQL什么是NoSQLNoSQL特点阿里巴巴演进分析阿里巴巴中文站架构发展历程简单分析 NoSQL…

MySQL架构设计其实很简单

一、概述 我们很多互联网项目首选的数据库就是MySql5.7&#xff0c;因为免费&#xff0c;支持数据库主从复制&#xff0c;读写分离&#xff0c;且语法简单&#xff0c;容易上手&#xff0c;虽然对sql的函数、触发器、存储过程有一定的了解&#xff0c;也能说出一些优化sql语句…

基于SpringBoot+Vue的前后端分离的博客管理系统

菜单 首页写文章内容管理 博客管理相册管理归档登录、注册(项目整合了shiro+jwt+redis,用户未登录不能发布博客、内容管理、相册、归档等功能) 文章​​​​​​​末尾赋前后端代码以及数据库文件链接!!! 1 首页 首页包括菜单、博客、登录用户、推荐博客排行、博客分类…

Autosar-Interface接口

文章目录 一、Autosar接口1、AUTOSAR Interface2、Standardized Interface3、Standardized AUTOSAR Interface二、AUTOSAR接口的通用规则三、示例-存储四、总结一、Autosar接口 在Autosar里规定了三类接口,分别是AUTOSAR接口,标准AUTOSAR接口和标准接口。 下图将所有的接口…

【Linux】I/O复用

概述 I/O复用使得程序能同时监听多个文件描述符&#xff0c;看文件上是否有用户感兴趣的事件发生&#xff0c;提高程序性能。 使用I/O复用技术的情况&#xff1a; 客户端同时处理多个套接字 客户端同时处理用户输入和网络连接 同时监听多个端口 同时处理TCP和UDP请求 TCP服务器…

【JavaEE】文件操作(InputStream、OutputStream)

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 在Java中总会用到文件操作&#xff0c;比如从盘符读写文件&#xff0c;按字节和字符进行数据读写&#xff0c;那么你真的认识什么是文件路径吗&#xff1f;平时谈到的“文件”&#xff0c;…

mybatis实现CRUD详解(使用mapper映射文件实现增删改查)

mybatis实现CRUD详解(使用mapper映射文件实现增删改查) 创建maven项目&#xff1a;项目结构如图所示 准备数据库表&#xff1a; 准备pom.xml所需的依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.…

快速弄懂RPC

快速弄懂RPC 常见的远程通信方式远程调用RPC协议RPC的运用场景和优势 常见的远程通信方式 基于REST架构的HTTP协议以及基于RPC协议的RPC框架。 远程调用 是指跨进程的功能调用。 跨进程可以理解为一个计算机节点的多个进程或者多个计算机节点的多个进程。 RPC协议 远程过…

C++string类

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解了C中的string类以及类内的一些常用函数 Cstring类 文章…