基于OpenGL的简单渲染器实现
上次讲到配置完环境,这次先从ImGui开始简单介绍
由于我们使用了GLFW作为窗口管理的库,所以ImGui也是与GLFW相辅相成的
ImGui的使用流程大致如下:
1
2
3
4
5
6
7
8
9
|
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
{
ImGui::Begin("Edit"); // Create a window called "Hello, world!" and append into it.
//自定义内容
ImGui::End();
}
ImGui::Render();
|
在了解创建窗口和GUI之前,我们需要先了解一下渲染器的整体流程,这里有所简化
(实例化GLFW窗口,创建窗口对象 -> 初始化GLAD -> 开始渲染循环 -> 资源回收)
我们需要在创建GLFW窗口后,进行ImGui的绘制,所以在main函数中大概是这么一个流程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
int main()
{
//一些准备工作
InitGLFW();
Create_glfw_Window();
...
//---------------------render loop--------------------------------------
while (!glfwWindowShouldClose(window))
{
//------------绘制Imgui-----------------
RenderImGui();
//------------渲染工作------------------
......
glfwSwapBuffers(window);//双缓冲绘制
glfwPollEvents();
}
//一些资源释放等收尾工作
return 0;
}
|
为了让main函数内的流程更加清晰,我们把绘制GUI和创建窗口的环节单独拎出来,写一个叫GameFrame的头文件来进行管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
namespace GameFrame
{
//-------------------------glfw window creation-------------------------------------
GLFWwindow* Create_glfw_Window()
{
GLFWwindow* window = glfwCreateWindow(1200, 800, "OpenGLTest", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate();
//return -1;
}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glfwSetScrollCallback(window, InputManager::scroll_callback);
glfwSetCursorPosCallback(window, InputManager::mouse_callback);
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
return window;
}
//-------------------------imgui creation-------------------------------------
void RenderMainImGui()
{
ImGui_ImplOpenGL3_NewFrame();
ImGui_ImplGlfw_NewFrame();
ImGui::NewFrame();
{
ImGui::Begin("Edit"); // Create a window called "Hello, world!" and append into it.
ImGui::Text("Use 'Left Alter' to focus on window");
//自定义GUI内容
ImGui::End();
}
ImGui::Render();
}
}
|
此时就可以很清晰的把main函数的流程表示为
1
2
3
4
5
6
7
8
9
10
|
InitGLFW();
GLFWwindow* window = GameFrame::Create_glfw_Window();
InitImGui(window);
while (!glfwWindowShouldClose(window))
{
RenderMainImGui();
glClearColor();
...
}
//一些收尾工作
|
了解大致的流程后就可以开始正式开始编写渲染器了
这里推荐learnOpenGl网站,可以根据上面进行渲染的学习,后续还会介绍一些可能会踩到的坑和一些解决方式
LearOpenGL:https://learnopengl-cn.github.io/