一篇搞定利用开源库写一个OpenGL测试窗口小工具

这篇具有很好参考价值的文章主要介绍了一篇搞定利用开源库写一个OpenGL测试窗口小工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

由于代码不好抽离,所有的代码最终我会上传至百度网盘,附上连接,需要的可以对照的看文章,包括前面所有的学习笔记的,代码都有详细中文注释。Application为就main函数,ApplicationNew为新main函数,如有其他疑问,可以留言评论。

链接:https://pan.baidu.com/s/1gmosgzliBi4eqL22vmP1Cw?pwd=o2wg 提取码:o2wg

一、引入imgui库

二、制作一个可操控的模型变换矩阵的demo

三、测试框架

四、利用测试框架写一个颜色调试界面

​编辑

五、利用测试框架写一个纹理调试界面


由于代码不好抽离,所有的代码最终我会上传至百度网盘,附上连接,需要的可以对照的看文章,包括前面所有的学习笔记的,代码都有详细中文注释。Application为就main函数,ApplicationNew为新main函数,如有其他疑问,可以留言评论。

链接:https://pan.baidu.com/s/1gmosgzliBi4eqL22vmP1Cw?pwd=o2wg  提取码:o2wg

话不多说,我把我看的视频链接贴出来,下面的笔记是由视频学习和自己的补充而来。这次是(22-26)的笔记

跟着这个小哥的教学视频学的(YouTube原视频,科学上网AI字幕) ►               http://bit.ly/2lt7ccM
这个是哔哩哔哩网站有人搬运的 ►https://www.bilibili.com/video/BV1MJ411u7Bc/?share_source=copy_web&vd_source=80ce9fa9cc5a33fdc2b9a467859dd047
 

一、引入imgui库

现在我们来做一个可视化的调试工具,方便我们动态的创建调试更改我们的OpenGL
https://github.com/ocornut/imgui

引入开源imgui,然后按照例子学一个demo出来,可视化的界面就显示出来了。

我下载的是1.6.0版本的imgui,然后下载源码,把需要的的头文件,源文件拷贝到项目源代码的一个文件夹下,我的是:xxxxxx项目文件夹\src\vender\imgui

一篇搞定利用开源库写一个OpenGL测试窗口小工具,OpenGL,开源,c++,图形渲染,学习,笔记

一篇搞定利用开源库写一个OpenGL测试窗口小工具,OpenGL,开源,c++,图形渲染,学习,笔记

一篇搞定利用开源库写一个OpenGL测试窗口小工具,OpenGL,开源,c++,图形渲染,学习,笔记

然后记得把main排除在项目外

一篇搞定利用开源库写一个OpenGL测试窗口小工具,OpenGL,开源,c++,图形渲染,学习,笔记

 我们可以通过这个main查看imgui这个demo是怎么使用实现的,我大致抽离了一下再OpenGL中imgui 的使用流程如下:

 // Setup ImGui binding
        ImGui::CreateContext();
        ImGui_ImplGlfwGL3_Init(window, true);
        ImGui::StyleColorsDark();

            ImGui_ImplGlfwGL3_NewFrame();

            ImGui::Render();
            ImGui_ImplGlfwGL3_RenderDrawData(ImGui::GetDrawData());

    // Cleanup
    ImGui_ImplGlfwGL3_Shutdown();
    ImGui::DestroyContext();

二、制作一个可操控的模型变换矩阵的demo

然后我们根据demo做一个可以操控的模型变换矩阵的视图

		// Setup ImGui binding
		ImGui::CreateContext();
		ImGui_ImplGlfwGL3_Init(window, true);
		ImGui::StyleColorsDark();
        
		glm::vec3 translationA(200, 200, 0);

        /* Loop until the user closes the window */
		while (!glfwWindowShouldClose(window))
		{
			/* Render here */
			//glClear(GL_COLOR_BUFFER_BIT);
			renderer.Clear();

			ImGui_ImplGlfwGL3_NewFrame();

            texture.Bind(0);
            {
				glm::mat4 model = glm::translate(glm::mat4(1.0f), translationA);
				glm::mat4 mvp = proj * view * model;
				shader.Bind();
				shader.SetUniformMat4f("u_MVP", mvp);
				shader.SetUniform1i("u_Texture", 0);
				//我们可以在每次画之前从cpu更改uniform变量的值然后传入,这样就可以有变化的效果了
				//shader.SetUniform4f("u_Color", r, 0.3f, 0.8f, 1.0f);

				//当我们使用索引缓冲区之后,我们就不是DrawArrays了,而是DrawElement了
				//GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr));
				
				renderer.Draw(va, ib, shader);

			}

			{   
                // Edit 1 float using a slider from 0.0f to 1.0f             
				ImGui::SliderFloat3("translationB", &translationB.x, 0.0f, 960.0f);            
				ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / 
                ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
			}
			ImGui::Render();
			ImGui_ImplGlfwGL3_RenderDrawData(ImGui::GetDrawData());


			/* Swap front and back buffers */
			glfwSwapBuffers(window);

			/* Poll for and process events */
			glfwPollEvents();
		}

	ImGui_ImplGlfwGL3_Shutdown();
	ImGui::DestroyContext();
	glfwTerminate();

效果如下gif

一篇搞定利用开源库写一个OpenGL测试窗口小工具,OpenGL,开源,c++,图形渲染,学习,笔记
现在我们如果要渲染另一种东西,也就是比如着色器动态化,顶点动态化,顶点索引都变化了的情况,怎么做到呢,就拿我们要在屏幕的不同位置画两个一样的图标为例,无非就是再画一个。

		// Setup ImGui binding
		ImGui::CreateContext();
		ImGui_ImplGlfwGL3_Init(window, true);
		ImGui::StyleColorsDark();
        
		glm::vec3 translationA(200, 200, 0);
		glm::vec3 translationB(400, 200, 0);

        /* Loop until the user closes the window */
		while (!glfwWindowShouldClose(window))
		{
			/* Render here */
			//glClear(GL_COLOR_BUFFER_BIT);
			renderer.Clear();

			ImGui_ImplGlfwGL3_NewFrame();

            texture.Bind(0);
            {
				glm::mat4 model = glm::translate(glm::mat4(1.0f), translationA);
				glm::mat4 mvp = proj * view * model;
				shader.Bind();
				shader.SetUniformMat4f("u_MVP", mvp);
				shader.SetUniform1i("u_Texture", 0);
				//我们可以在每次画之前从cpu更改uniform变量的值然后传入,这样就可以有变化的效果了
				//shader.SetUniform4f("u_Color", r, 0.3f, 0.8f, 1.0f);

				//当我们使用索引缓冲区之后,我们就不是DrawArrays了,而是DrawElement了
				//GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr));
				
				renderer.Draw(va, ib, shader);

			}
			{
				glm::mat4 model = glm::translate(glm::mat4(1.0f), translationB);
				glm::mat4 mvp = proj * view * model;
				shader.Bind();
				shader.SetUniformMat4f("u_MVP", mvp);
				shader.SetUniform1i("u_Texture", 0);
				//我们可以在每次画之前从cpu更改uniform变量的值然后传入,这样就可以有变化的效果了
				//shader.SetUniform4f("u_Color", r, 0.3f, 0.8f, 1.0f);

				//当我们使用索引缓冲区之后,我们就不是DrawArrays了,而是DrawElement了
				//GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr));
				
				renderer.Draw(va, ib, shader);

			}

			{
                // Edit 1 float using a slider from 0.0f to 1.0f    
				ImGui::SliderFloat3("translationA", &translationA.x , 0.0f, 960.0f);   
                // Edit 1 float using a slider from 0.0f to 1.0f             
				ImGui::SliderFloat3("translationB", &translationB.x, 0.0f, 960.0f);            
				ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / 
                ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
			}
			ImGui::Render();
			ImGui_ImplGlfwGL3_RenderDrawData(ImGui::GetDrawData());


			/* Swap front and back buffers */
			glfwSwapBuffers(window);

			/* Poll for and process events */
			glfwPollEvents();
		}

	ImGui_ImplGlfwGL3_Shutdown();
	ImGui::DestroyContext();
	glfwTerminate();

效果如下:

一篇搞定利用开源库写一个OpenGL测试窗口小工具,OpenGL,开源,c++,图形渲染,学习,笔记

但是这样如果要画满屏幕呢,每次画一个就要渲染一次,
想象我们现在要画一个2D的游戏地图,都是由一样的方块组成,我们如果按照模型矩阵的方式去画,那就要画一千次,那是相当慢的,
所以策略不止一次,还有种方法就是我拿到2D地图的所有顶点,然后塞到一个顶点缓冲区去,然后用顶点索引缓冲区去找位置,然后再画,这样就会快很多,所以这个例子只是展示可以这样动态改变uniform变量的方法来改变画的位置,需要举一反三,然后深入进去,灵活变通着用。

三、测试框架

活用测试框架,搭建你想搭建的所有测试。

#pragma once

#include <functional>
#include <vector>
#include <string>
#include <iostream>
//仿照着imgui这个命名空间式的方式创建一种插入式的调试类,我们先写调试类的抽象类
//可以根据这个类来做拓展,可以动态的变化出来许多实例类,然后这些类可以动态的在
//我们渲染图像的时候进行调试,比如图形的颜色啊等等,方便我们可视化我们要达到的效果
namespace test {

	class Test {
	public:
		Test(){}
		virtual  ~Test() {}

		//继承的子类都可重写
		//更新虚函数
		virtual void OnUpdate(float deltaTime) {}
		//渲染器虚函数
		virtual void OnRender() {}
		//渲染界面虚函数
		virtual void OnImGuiRender() {}

	};

	//创建一个测试菜单类,帮助我们动态创建和选择测试窗口
	class TestMenu : public Test {
	public:
		TestMenu(Test*& CurrentTestPoniter);

		void OnImGuiRender() override;

		template<typename T>
		void RegisterTest(const std::string& name)
		{
			std::cout << "RegisterTest Test :" << name << std::endl;
			m_Tests.push_back(std::make_pair(name, []() {
					return new T();
				}));
		}
	private:
		//引用自 Test*& CurrentTestPoniter,就是Test的指针,它是抽象类,所以可以多态成为所有继承它的类
		Test*& m_CurrentTest;
		std::vector<std::pair<std::string, std::function<Test* ()>>> m_Tests;
	};
}





#include "Test.h"
#include "imgui/imgui.h"
namespace test 
{

	TestMenu::TestMenu(Test*& CurrentTestPoniter)
		: m_CurrentTest(CurrentTestPoniter)
	{

	}

	void TestMenu::OnImGuiRender()
	{
		for (auto& test : m_Tests)
		{
			if (ImGui::Button(test.first.c_str()))
				m_CurrentTest = test.second();
		}
	}

}

接下来我们利用调试框架写一个颜色调试和纹理调试类

四、利用测试框架写一个颜色调试界面

类如下:

#include "Test.h"

namespace test {
	class TestClearColor : public Test 
	{
	public:
		TestClearColor() ;
		~TestClearColor() ;

		void OnUpdate(float deltaTime) override;
		void OnRender()  override;
		void OnImGuiRender() override;
	private:
		float m_ClearColor[4];
	};



#include "TestClearColor.h"

#include "GL/glew.h"
#include "Renderer.h"
#include "imgui/imgui.h"

namespace test {

	TestClearColor::TestClearColor()
		:m_ClearColor{ 0.2f, 0.3f, 0.8f, 1.0f }
	{

	}

	TestClearColor::~TestClearColor()
	{

	}

	void TestClearColor::OnUpdate(float deltaTime)
	{

	}

	void TestClearColor::OnRender()
	{
		GLCall(glClearColor(m_ClearColor[0], m_ClearColor[1], m_ClearColor[2], m_ClearColor[3]))
		GLCall(glClear(GL_COLOR_BUFFER_BIT));
	}

	void TestClearColor::OnImGuiRender()
	{
		ImGui::ColorEdit4("Clear_Color", m_ClearColor);
	}

}

如何调用:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <fstream>
#include <sstream>

#include "Renderer.h"
#include "VertexBuffer.h"
#include "VertexBufferLayout.h"
#include "IndexBuffer.h"
#include "VertexArray.h"
#include "Shader.h"
#include "Texture.h"

#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"

#include "imgui/imgui.h"
#include "imgui/imgui_impl_glfw_gl3.h"

#include "tests/TestClearColor.h"

int main()
{
	GLFWwindow* window;

	/* Initialize the library */
	if (!glfwInit())
		return -1;

	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);


	//if (glewInit() != GLEW_OK)
	//	std::cout << "GLEWInit ERROR!" << std::endl;

	/* Create a windowed mode window and its OpenGL context */
	window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
	if (!window)
	{
		glfwTerminate();
		return -1;
	}

	/* Make the window's context current */
	glfwMakeContextCurrent(window);

	//设置一些框架因素
	glfwSwapInterval(2);

	if (glewInit() != GLEW_OK)
		std::cout << "GLEWInit ERROR!" << std::endl;
		std::cout << "OpenGL的版本是:" << glGetString(GL_VERSION) << std::endl;
	{

		//启用混合和透明功能
		GLCall(glEnable(GL_BLEND));
		//设置混合和透明功能。。。暂不清楚详细情况
		GLCall(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));

		//创建一个渲染器实例
		Renderer renderer;

		// Setup ImGui binding
		ImGui::CreateContext();
		ImGui_ImplGlfwGL3_Init(window, true);
		ImGui::StyleColorsDark();

		test::TestClearColor testClearColor;

		/* Loop until the user closes the window */
		while (!glfwWindowShouldClose(window))
		{
			/* Render here */

			GLCall(glClearColor(0.0f, 0.0f, 0.0f, 0.0f));
			//glClear(GL_COLOR_BUFFER_BIT);
			renderer.Clear();

			testClearColor.OnUpdate(0.0f);
			testClearColor.OnRender();

			ImGui_ImplGlfwGL3_NewFrame();
			
			testClearColor.OnImGuiRender();

			ImGui::Render();
			ImGui_ImplGlfwGL3_RenderDrawData(ImGui::GetDrawData());


			/* Swap front and back buffers */
			glfwSwapBuffers(window);

			/* Poll for and process events */
			glfwPollEvents();
		}

		delete currenttest;
		if (currenttest != testMenu)
			delete testMenu;
		//glDeleteProgram(shaderID);
	}
	// Cleanup
	ImGui_ImplGlfwGL3_Shutdown();
	ImGui::DestroyContext();
	glfwTerminate();
	return 0;
}

一篇搞定利用开源库写一个OpenGL测试窗口小工具,OpenGL,开源,c++,图形渲染,学习,笔记

五、利用测试框架写一个纹理调试界面

#pragma once

#include "Test.h"

#include "VertexBuffer.h"
#include "VertexBufferLayout.h"
#include "Texture.h"

#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"

#include <memory>

namespace test {
	class TestTexture2D : public Test
	{
	public:
		TestTexture2D() ;
		~TestTexture2D() ;

		void OnUpdate(float deltaTime) override;
		void OnRender()  override;
		void OnImGuiRender() override;
	private:
		//这里使用智能指针的原因,就是自动管理生命周期,防止在调用中的内存泄漏问题
		std::unique_ptr<VertexArray> m_VAO;
		std::unique_ptr <IndexBuffer> m_IndexBuffer;
		std::unique_ptr <VertexBuffer> m_VertexBuffer;
		std::unique_ptr <VertexBufferLayout> m_VertexBufferLayout;
		std::unique_ptr <Shader> m_Shader;
		std::unique_ptr <Texture> m_Texture;
		
		glm::mat4 m_proj;
		glm::mat4 m_model;
		glm::mat4 m_view;
		glm::vec3 m_TranslationA;
		glm::vec3 m_TranslationB;
	};
}


#include "TestTexture2D.h"

#include "GL/glew.h"
#include "Renderer.h"
#include "imgui/imgui.h"

namespace test {

	TestTexture2D::TestTexture2D()
		:m_proj(glm::ortho(0.0f, 960.0f, 0.0f, 540.0f, -1.0f, 1.0f)),
		m_view(glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, 0))),
		m_TranslationA(200, 200, 0), m_TranslationB(400, 200, 0)
	{
		float positions[] = {
			/*顶点坐标*/-50.0f,  -50.0f,
			/*这个纹理坐标就是告诉着色器,
			我们的图像需要的纹理应该对应关系,
			比如我一个矩形的左下角-0.5f, -0.5f,
			对应纹理的左下角, 0.0f, -0.0f,
			因为纹理是0,0坐标原点*/ 0.0f, -0.0f,//0
			 50.0f,  -50.0f, 1.0f, -0.0f,//1
			 50.0f,   50.0f, 1.0f,  1.0f,//2
			-50.0f,   50.0f, 0.0f,  1.0f//3
		};
		unsigned int indices[]{
			0,1,2,
			2,3,0
		};


		//启用混合和透明功能
		GLCall(glEnable(GL_BLEND));
		//设置混合和透明功能。。。暂不清楚详细情况
		GLCall(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));



		//通过封装的顶点阵列类来完成绑定缓冲区以及设置顶点布局
		m_VAO = std::make_unique<VertexArray>();

		//通过封装好的VertexBuffer类进行上述操作
		m_VertexBuffer = std::make_unique<VertexBuffer>(positions, 4 * 4 * sizeof(float));

		//声明一个布局对象,然后写入布局的参数,操作顶点阵列类中的AddBuffer,完成自动绑定操作
		m_VertexBufferLayout = std::make_unique<VertexBufferLayout>();
		m_VertexBufferLayout->Push<float>(2);
		//再加入的两组数是用来传纹理坐标的
		m_VertexBufferLayout->Push<float>(2);
		m_VAO->AddBuffer(*m_VertexBuffer, *m_VertexBufferLayout);

		//通过封装好的IndexBuffer类进行上述操作
		m_IndexBuffer = std::make_unique<IndexBuffer>(indices, 6);

		//通过封装好的着色器类来创建着色器
		m_Shader = std::make_unique<Shader>("res/shaders/Basic.shader");

		//通过封装好的纹理类创建纹理对象
		m_Texture = std::make_unique<Texture>("res/textures/OpenGL-removebg-preview.png");

		m_Shader->SetUniform1i("u_Texture", 0);
	}

	TestTexture2D::~TestTexture2D()
	{

	}

	void TestTexture2D::OnUpdate(float deltaTime)
	{

	}

	void TestTexture2D::OnRender()
	{
		GLCall(glClearColor(0.0f, 0.0f, 0.0f, 0.0f))
		GLCall(glClear(GL_COLOR_BUFFER_BIT));

		Renderer renderer;
		//绑定纹理槽(物理意义的槽)
		m_Texture->Bind(0);

		{
			m_model = glm::translate(glm::mat4(1.0f), m_TranslationA);
			glm::mat4 mvp = m_proj * m_view * m_model;
			m_Shader->Bind();
			m_Shader->SetUniformMat4f("u_MVP", mvp);
			//我们可以在每次画之前从cpu更改uniform变量的值然后传入,这样就可以有变化的效果了
			//shader.SetUniform4f("u_Color", r, 0.3f, 0.8f, 1.0f);

			//当我们使用索引缓冲区之后,我们就不是DrawArrays了,而是DrawElement了
			//GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr));

			renderer.Draw(*m_VAO, *m_IndexBuffer, *m_Shader);

		}

		{
			m_model = glm::translate(glm::mat4(1.0f), m_TranslationB);
			glm::mat4 mvp = m_proj * m_view * m_model;
			m_Shader->Bind();
			m_Shader->SetUniformMat4f("u_MVP", mvp);
			//我们可以在每次画之前从cpu更改uniform变量的值然后传入,这样就可以有变化的效果了
			//shader.SetUniform4f("u_Color", r, 0.3f, 0.8f, 1.0f);

			//当我们使用索引缓冲区之后,我们就不是DrawArrays了,而是DrawElement了
			//GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr));

			renderer.Draw(*m_VAO, *m_IndexBuffer, *m_Shader);

		}
	}

	void TestTexture2D::OnImGuiRender()
	{
			ImGui::SliderFloat3("translationA", &m_TranslationA.x, 0.0f, 960.0f);            // Edit 1 float using a slider from 0.0f to 1.0f    
			ImGui::SliderFloat3("translationB", &m_TranslationB.x, 0.0f, 960.0f);            // Edit 1 float using a slider from 0.0f to 1.0f    
			ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
	}

}

如何调用:

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <fstream>
#include <sstream>

#include "Renderer.h"
#include "VertexBuffer.h"
#include "VertexBufferLayout.h"
#include "IndexBuffer.h"
#include "VertexArray.h"
#include "Shader.h"
#include "Texture.h"

#include "glm/glm.hpp"
#include "glm/gtc/matrix_transform.hpp"

#include "imgui/imgui.h"
#include "imgui/imgui_impl_glfw_gl3.h"

#include "tests/TestClearColor.h"
#include "tests/TestTexture2D.h"

int main()
{
	//std::cout << "Hello OpenGL" << std::endl;
	//std::cin.get();

	GLFWwindow* window;

	/* Initialize the library */
	if (!glfwInit())
		return -1;

	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);


	//if (glewInit() != GLEW_OK)
	//	std::cout << "GLEWInit ERROR!" << std::endl;

	/* Create a windowed mode window and its OpenGL context */
	window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
	if (!window)
	{
		glfwTerminate();
		return -1;
	}

	/* Make the window's context current */
	glfwMakeContextCurrent(window);

	//设置一些框架因素
	glfwSwapInterval(2);

	if (glewInit() != GLEW_OK)
		std::cout << "GLEWInit ERROR!" << std::endl;
		std::cout << "OpenGL的版本是:" << glGetString(GL_VERSION) << std::endl;
	{

		//启用混合和透明功能
		GLCall(glEnable(GL_BLEND));
		//设置混合和透明功能。。。暂不清楚详细情况
		GLCall(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));

		//创建一个渲染器实例
		Renderer renderer;

		// Setup ImGui binding
		ImGui::CreateContext();
		ImGui_ImplGlfwGL3_Init(window, true);
		ImGui::StyleColorsDark();

		//作为抽象类的指针,可以接收所有的子类的对象指针
		test::Test* currenttest = nullptr;
		test::TestMenu* testMenu = new test::TestMenu(currenttest);
		currenttest = testMenu;

		testMenu->RegisterTest<test::TestClearColor>("Clear Color");
		testMenu->RegisterTest<test::TestTexture2D>("TestTexture2D");

		生成一个testClearColor类
		//test::TestClearColor testClearColor;

		/* Loop until the user closes the window */
		while (!glfwWindowShouldClose(window))
		{
			/* Render here */

			GLCall(glClearColor(0.0f, 0.0f, 0.0f, 0.0f));
			//glClear(GL_COLOR_BUFFER_BIT);
			renderer.Clear();

			//testClearColor.OnUpdate(0.0f);
			//testClearColor.OnRender();

			ImGui_ImplGlfwGL3_NewFrame();
			if (currenttest)
			{
				currenttest->OnUpdate(0.0f);
				currenttest->OnRender();
				ImGui::Begin("Test");
				//因为一直循环,所以当执行下面if的时候,如果currenttest != testMenu
				//则会继续执行ImGui::Button("<-"),就相当于把按钮变为返回按键了。
				//这个时候如果你在按下Button("<-"),那么这个if才是成立的,才会把菜单testMenu赋值回来
				if (currenttest != testMenu && ImGui::Button("<-"))
				{
					delete currenttest;
					currenttest = testMenu;
				}
				//当这里渲染测试界面的时候,作为菜单类先进入TestMenu::OnImGuiRender()
				//找到对应的注册好的按钮对应的类,然后把类赋值给m_CurrentTest
				//这个时候currenttest就是指向m_CurrentTest实例类的指针了。
				currenttest->OnImGuiRender();
				ImGui::End();
			}
			//testClearColor.OnImGuiRender();

			ImGui::Render();
			ImGui_ImplGlfwGL3_RenderDrawData(ImGui::GetDrawData());


			/* Swap front and back buffers */
			glfwSwapBuffers(window);

			/* Poll for and process events */
			glfwPollEvents();
		}

		delete currenttest;
		if (currenttest != testMenu)
			delete testMenu;
		//glDeleteProgram(shaderID);
	}
	// Cleanup
	ImGui_ImplGlfwGL3_Shutdown();
	ImGui::DestroyContext();
	glfwTerminate();
	return 0;
}

之后我们就要接触批量渲染,材质,3D等等由浅入深的内容了文章来源地址https://www.toymoban.com/news/detail-770916.html

到了这里,关于一篇搞定利用开源库写一个OpenGL测试窗口小工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DeepBI一个AI开源数据软件是如何简单几句话搞定数亿条数据分析

    重磅消息 : DeepBI 已经支持 Starrocks 了,几句话搞定 数亿条 数据分析已经实锤了!!! 传统数据分析就像是一座大山,压得人喘不过气。采集、存储、筛选、整合、人工预测、技术实现,每一步都如同攀登峭壁,艰难而耗时。而随着AI时代的到来, DeepBI 如同一股清流,简化

    2024年01月23日
    浏览(30)
  • ubuntu下 利用QT 实现嵌入另外一个程序到当前窗口

    查看当前应用窗口名称

    2024年02月11日
    浏览(40)
  • LuaHttp库写的一个简单的爬虫

    LuaHttp库是一个基于Lua语言的HTTP客户端库,可以用于爬取网站数据。与Python的Scrapy框架类似,LuaHttp库也可以实现网站数据的抓取,并且可以将抓取到的数据保存到数据库中。不过需要注意的是,LuaHttp库并不像Scrapy框架那样具有完整的爬虫框架功能,需要自己编写代码实现。同

    2024年02月05日
    浏览(46)
  • Python用RoboBrowser库写一个通用爬虫模版

    以下是一个使下载lianjia内容的Python程序,爬虫IP服务器为duoip的8000端口。 请注意,这个程序只是一个基本的示例,实际使用时可能需要根据具体需求进行修改。例如,你可能需要处理网络错误,解析网页内容,保存下载的文件等等。同时,使用爬虫IP服务器时需要遵守相关的

    2024年02月05日
    浏览(36)
  • Scala语言用Selenium库写一个爬虫模版

    首先,我将使用Scala编写一个使用Selenium库下载yuanfudao内容的下载器程序。 然后我们需要在项目的build.sbt文件中添加selenium的依赖项。以下是添加Selenium依赖项的代码: 接下来,我们需要创建一个Selenium的WebDriver对象,以便我们可以使用它来控制浏览器。以下是如何创建WebDri

    2024年02月05日
    浏览(27)
  • R语言用jsonlite库写的一个图片爬虫

    以下是一个使用R语言和jsonlite库下载图片的程序。首先,我们需要导入jsonlite库和options()函数,然后将代理服务器的主机名和端口号设置为\\\"duoip\\\"和\\\"8000\\\"。接着,我们将URL设置为\\\"https://yun.baidu.com/\\\",并使用curl::curl_download()函数下载图片。 请注意,这个程序可能无法正常工作,因

    2024年02月06日
    浏览(35)
  • Lua-http库写一个爬虫程序怎么样 ?

    以下是一个使用Lua-http库编写的一个爬虫程序,该爬虫使用Lua语言来抓取www.snapchat.com的内容。 代码必须使用以下代码:get_proxy 请注意,您需要将 your_proxy_server.com 和 port 替换为实际的爬虫IP服务器地址和端口号。此外,您还需要在请求中设置正确的爬虫IP授权和用户爬虫IP。希

    2024年02月07日
    浏览(38)
  • 一篇搞定Kafka

     目录 1、Kafka的四个角色解释 2、Kafka与zookeeper的关系与环境搭建 3、Kafka入门小案例 4、Kafka分区机制 4.1、Topic在分区下如何存储消息 ​4.2、消息的分区策略 5、Kafka高可用设计方案 5.1、集群 5.2、备份机制(Replication) 5.2.1、两种追随者 6、生产者详解 6.1、参数配置 7、消费者详解

    2024年01月20日
    浏览(34)
  • 爬虫技术——一篇全搞定!

    目录 目录: 1. 爬虫介绍 1.1 爬虫是什么 1.2 爬虫步骤 1.3 爬虫分类 1.3.1 通用爬虫 1.3.2 聚焦爬虫  ​编辑 1.4 一些常见的反爬手段  2. Urllib 2.1 urllib库的使用 2.2 请求对象的定制 2.3 编解码 2.3.1 get请求方式:urllib.parse.quote() 2.3.2 get请求方式:urllib.parse.urlencode() 2.3.3 post请求方式

    2023年04月09日
    浏览(21)
  • 一篇搞定微信小程序

    view 普通视图区域 类似于html中的div,是一个块级元素 常用来实现页面的布局效果 基本使用 scroll-view 可滚动的视图区域 常用来实现滚动列表效果 基本使用 swiper和swiper-item 轮播图组件和轮播图item组件 基本使用 常用属性 text 文本组件 类似于html中的span标签,行内元素 基本使

    2024年04月25日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包