搭建ImGui例子中的第一個OpenGl2環境
一丶搭建OpenGL2環境
我們學習ImGui.可以看到.有幾個例子
分別是:
OpenGl2 OpenGl3 Directx11 Directx10 Directx9
因為要學習例子或者什么.最好移植到自己的工程中進行學習.
所以先把第一個OpenGl2的移植寫一下.后面會將5個例子都會移植過來.然后進行學習.
首先下載 OpenGl需要的庫. 也就是說GLFW.
1.下載GLFW庫
官網下載:
https://www.glfw.org/download.html
如下圖:
根據你當前項目的選擇.下載32位或者64位.
2.解壓GLFW庫.
下載之后解壓.
如下圖:
里面我們需要關注的是 include 頭文件 以及 lib-vcxxxx 其中跟你你VS的環境.進行選擇.
比如我們的是VS2013. 我就選擇vs2013.
3.將GLFW庫拷貝到你的工程文件下.
這一步就重要了.
首先我們需要的是 include目錄 以及 lib-vcxxx目錄. 我們拷貝到我們的目錄下.
這里我新建一個文件夾.名字就叫做GLFW. 我們里面就是存放的我們拷貝的文件.
4.配置到Vs2013中.
4.1配置屬性中的附加包含目錄
這一步很重要了.
首先打開工程項目屬性.找到C/C++一欄.看到附加包含目錄. 設置為我們剛剛的 文件夾下的include
這一步重要的地方就在於.我們的文件是放在哪里.如果你放在跟我一樣的目錄下.直接這樣引用. 但是上面還有一層目錄.
如果你放在了上一層目錄. 你這里就要寫成 ..\GLFW\include 總的來說就是路徑配置問題.
4.2配置屬性中的連接器常規屬性的附加庫目錄
這一個跟我們一樣.設置lib所在的目錄即可.
如下
4.3配置屬性中的輸入中的附加依賴項.
配置的命令行為:
opengl32.lib;glfw3.lib;%(AdditionalDependencies)
如下:
此時我們的OpenGl就搭建好了.使用我們的代碼進行測試.
5.測試OpenGl是否搭建成功
#include <stdio.h>
#include <Windows.h>
#include <tchar.h>
#ifdef __APPLE__
#define GL_SILENCE_DEPRECATION
#endif
#include <GLFW/glfw3.h> //注意這個位置.你設置了目錄直接這樣引用就行.GLFW不是我們建立的文件夾.而是include里面的GLFW
static void glfw_error_callback(int error, const char* description)
{
fprintf(stderr, "Glfw Error %d: %s\n", error, description);
}
int WINAPI _tWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
//int main()
{
// Setup window
//glfwSetErrorCallback(glfw_error_callback);
//初始化OpenGl
if (!glfwInit())
return 1;
//創建OpenGl窗口
GLFWwindow* window = glfwCreateWindow(1280, 720, "IBinary", NULL, NULL);
if (window == NULL)
return 1;
//設置上下文.以及進行交換.
glfwMakeContextCurrent(window);
glfwSwapInterval(1); // Enable vsync
//開始進行循環.判斷gl窗口是否關閉.不關閉一直循環.
while (!glfwWindowShouldClose(window))
{
glfwPollEvents(); //創建接收事件,相當於消息循環.如果不加則不響應消息.
//這些代碼可以省略.加了這些代碼是設置Open內部的窗口顏色什么的
int display_w, display_h;
glfwGetFramebufferSize(window, &display_w, &display_h);
glViewport(0, 0, display_w, display_h);
glClearColor(0.45f, 0.55f, 0.60f, 1.00f);
glClear(GL_COLOR_BUFFER_BIT);
glfwMakeContextCurrent(window);
glfwSwapBuffers(window);
// Cleanup
}
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
運行:
這樣我們的一個OpenGl2的窗口就已經搭建好了.
但是我們說了.是要配合ImGui.所以我們繼續進行配置ImGui.
二丶OpenGL2 跟ImGui相結合.
2.1下載ImGui
Imgui是一個很簡單的庫.如果想使用.我們需要去Github進行下載.
https://github.com/ocornut/imgui
上面也有使用說明
如下:
他告訴了我們ImGui需要的CPP以及頭文件. 以及Imgui如何編寫繪制代碼啊
ImGui::Text("HelloWorld");
這樣我們就在窗口上繪制了一段話.
2.2.配置ImGui到OpenGl2中.
首先,先把你解壓的Imgui下的需要的頭文件都拷貝到我們工程下面.當然你可以配置文件夾.
跟上面一樣.配置我們的目錄.
如下:
然后將.h文件跟.cpp文件加載到我們工程中.
查看Imgui OpenGui2的例子.看看還需要哪些頭文件.
可以看到.還需要4個支持OpenGl2的額外文件.我們也拷貝過來加載到工程中.
拷貝到工程之后可以拷貝ImGui例子代碼進行測試了
代碼如下:
#include "imgui.h"
#include "imgui_impl_glfw.h"
#include "imgui_impl_opengl2.h"
#include <stdio.h>
#include <Windows.h>
#include <tchar.h>
#ifdef __APPLE__
#define GL_SILENCE_DEPRECATION
#endif
#include <GLFW/glfw3.h>
#if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS)
#pragma comment(lib, "legacy_stdio_definitions")
#endif
int WINAPI _tWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
if (!glfwInit()) //初始化OpenGl
return 1;
//創建OpenGl窗口
GLFWwindow* window = glfwCreateWindow(1280, 720, "Dear ImGui GLFW+OpenGL2 example", NULL, NULL);
if (window == NULL)
return 1;
//設置OpenGl山下文
glfwMakeContextCurrent(window);
glfwSwapInterval(1); // Enable vsync
// 設置ImGui舌下文.
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO(); (void)io;
//設置顏色風格
ImGui::StyleColorsDark();
// Setup Platform/Renderer bindings
ImGui_ImplGlfw_InitForOpenGL(window, true);
ImGui_ImplOpenGL2_Init();
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
// Main loop
while (!glfwWindowShouldClose(window))
{
glfwPollEvents();
// Start the Dear ImGui frame 啟動IMgui Frame框架.
ImGui_ImplOpenGL2_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
{
//開始繪制ImGui
ImGui::Begin("IBinary Windows"); // Create a window called "Hello, world!" and append into it.
ImGui::Text("IBinary Blog");
//ImGui::SameLine();
ImGui::Indent(); //另起一行制表符開始繪制Button
ImGui::Button("2222", ImVec2(100, 50));
ImGui::End();
}
// 3. Show another simple window.
// Rendering
ImGui::Render();
int display_w, display_h;
glfwGetFramebufferSize(window, &display_w, &display_h);
glViewport(0, 0, display_w, display_h);
glClearColor(clear_color.x, clear_color.y, clear_color.z, clear_color.w);
glClear(GL_COLOR_BUFFER_BIT);
ImGui_ImplOpenGL2_RenderDrawData(ImGui::GetDrawData()); //必須在繪制完Open之后接着繪制Imgui
//glUseProgram(last_program);
glfwMakeContextCurrent(window);
glfwSwapBuffers(window);
}
// Cleanup
ImGui_ImplOpenGL2_Shutdown();
ImGui_ImplGlfw_Shutdown();
ImGui::DestroyContext();
glfwDestroyWindow(window);
glfwTerminate();
return 0;
}
啟動之后
如果你啟動ImGui的例子.會發現一直有個控制台窗口.原因就是它是以main啟動.我們改成窗口程序啟動即可.