Browse Source

feat: 封装测试模块,不用再把代码写在一个文件里面了

NiceTry12138 10 months ago
parent
commit
7683a25e65

+ 152 - 0
图形学/OpenGL学习/README.md

@@ -852,6 +852,22 @@ while (!glfwWindowShouldClose(window))
 
 ## 顶点数组
 
+
+| 概念 | 存储内容 | 目标绑定类型 | 核心作用 |
+| ---  | --- |	---  | --- |
+| VBO |	GPU 显存中的顶点数据 |	GL_ARRAY_BUFFER |	高效存储顶点属性数据 |
+| VAO |	VBO 的配置状态(元数据) |	GL_VERTEX_ARRAY	| 管理 VBO 和顶点属性指针的关联关系 |
+| EBO |	GPU 显存中的索引数据 |	GL_ELEMENT_ARRAY_BUFFER |	优化索引绘制(减少顶点重复) |
+
+```
+VAO(配置管理器)
+├── 记录绑定的 VBO(`GL_ARRAY_BUFFER`)
+│   └── 存储顶点属性数据(位置、颜色等)
+├── 记录顶点属性指针(`glVertexAttribPointer`)
+└── 记录绑定的 EBO(`GL_ELEMENT_ARRAY_BUFFER`)
+    └── 存储索引数据(用于 `glDrawElements`)
+```
+
 **顶点缓冲**(`Vertex Buffer Objects`, VBOs)和**顶点数组**(`Vertex Array Objects`, VAOs)是用于高效管理和渲染顶点数据的关键技术。它们通常一起使用以优化图形渲染流程,但它们的功能和角色是不同的
 
 > 后面大多数情况会用 `VAO` 表示**顶点数组对象,**用 `VBO` 表示**顶点缓冲对象**
@@ -876,6 +892,8 @@ while (!glfwWindowShouldClose(window))
 - 数据的类型(例如,GL_FLOAT)
 - 数据应如何被顶点着色器接收(例如,位置数据应该链接到顶点着色器中的哪个属性)
 
+
+
 之前的流程是,绑定顶点缓冲区,设置布局,绑定索引缓冲区。现在是,绑定顶点数组,绑定索引缓冲区
 
 其实之前的代码中即使没有使用 `VAO`, `OpenGL` 兼容版仍然创建了 `VAO object 0` 为默认对象,如果将 `OpenGL` 设置为核心版就不一样了
@@ -925,6 +943,62 @@ glBindVertexArray(vao);
 
 如果需要注重开发效率,那么建议每个图元一个 `VAO`;如果每一字节的显存都需要非常小心使用,那么建议全局一个 `VAO`
 
+通常的工作流程是
+
+1. 创建并绑定 `VAO`
+
+```cpp
+glGenVertexArrays(1, &vao);
+glBindVertexArray(vao);
+```
+
+2. 创建并绑定 `VBO`,上传数据
+
+```cpp
+glGenBuffers(1, &vbo);
+glBindBuffer(GL_ARRAY_BUFFER, vbo);
+glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+```
+
+3. 设置顶点属性指针
+
+```cpp
+// 位置属性(假设每个顶点有3个float)
+glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
+glEnableVertexAttribArray(0);
+
+// 颜色属性(偏移3个float)
+glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float)));
+glEnableVertexAttribArray(1);
+```
+
+4. 创建并绑定 `EBO`
+
+```cpp
+glGenBuffers(1, &ebo);
+glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
+glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
+```
+
+5. 解绑 `VAO`
+
+```cpp
+glBindVertexArray(0);
+```
+
+6. 绘制时
+
+```cpp
+glBindVertexArray(vao);
+glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
+```
+
+一个 `VAO` 可以关联多个 `VBO`,比如一个 `VBO` 存位置,另一个存颜色
+
+`EBO` 的绑定要在 `VAO` 绑定时操作,因为 `EBO` 的绑定会被 `VAO` 记录,`GL_ELEMENT_ARRAY_BUFFER` 是 VAO 的一部分
+
+
+
 ## 简单封装抽象类
 
 ### 抽象顶点缓冲和索引缓冲
@@ -1475,3 +1549,81 @@ render.Draw(va, ibo, shader);
 
 > 很明显,在 `render.Draw` 中出现了重复绑定,会有点性能消耗
 
+为了减少 `Draw` 调用的次数,常用的方法还是把所有的贴图对象都塞到一个顶点缓冲区中,然后一次性渲染所有的东西
+
+### 添加测试模块
+
+为了方便测试,将代码抽离到测试模块中,方便不同功能测试
+
+将测试分成几个声明周期
+
+- Init	模块初始化
+- Exit	模块退出
+- OnUpdate	每帧更新计算逻辑
+- OnRender	每帧更新渲染逻辑
+- OnImGuiRender	每帧更新 UI 逻辑
+
+```cpp
+class Test
+{
+public:
+	Test() = default;
+	virtual ~Test() = default;
+	
+	virtual void Init() {};
+	virtual void Exit() {};
+
+	virtual void OnUpdate(float deltaTIme) {};
+	virtual void OnRender() {};
+	virtual void OnImGuiRender() {};
+};
+```
+
+未来所有的测试案例都只用继承 Test 新建一个基类即可,然后将测试代码根据生命周期封装到函数中即可
+
+```cpp
+class TestClearColor : public Test
+{
+public:
+	virtual void OnUpdate(float deltaTIme);
+	virtual void OnRender();
+	virtual void OnImGuiRender();
+
+private:
+	float m_ClearColor[4] = { 0.2f, 0.3f, 0.8f, 1.0f };
+};
+```
+
+在 `TestClearColor` 类中可以定义会用到的数据,而不需要跟之前一样定义到全局作用域中
+
+最后封装以下 `launch2` 函数,接下来只要修改 `Test::TestClearColor TestModule` 创建对象的类型,其他代码不用修改
+
+```cpp
+void launch2(GLFWwindow* window, ImGuiIO& io, glm::mat4& mvp)
+{
+	Test::TestClearColor TestModule;
+
+	glEnable(GL_BLEND);
+	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+	while (!glfwWindowShouldClose(window))
+	{
+		// 设置 ImGUI 新一帧
+		ImGui_ImplOpenGL3_NewFrame();
+		ImGui_ImplGlfw_NewFrame();
+		ImGui::NewFrame();
+
+		TestModule.OnUpdate(0.017f);
+		TestModule.OnRender();
+
+		TestModule.OnImGuiRender();
+
+		// 绘制 ImGUI
+		ImGui::Render();
+		ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
+
+		glfwSwapBuffers(window);
+		glfwPollEvents();
+	}
+}
+```

+ 10 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/OpenGLStudy.vcxproj

@@ -152,6 +152,9 @@
     <ClCompile Include="src\VertexArray.cpp" />
     <ClCompile Include="src\VertexBufferLayout.cpp" />
     <ClCompile Include="src\Texture.cpp" />
+    <ClCompile Include="src\test\Test.cpp" />
+    <ClCompile Include="src\test\TestClearColor.cpp" />
+    <ClCompile Include="src\test\TestRenderTexture.cpp" />
   </ItemGroup>
   <ItemGroup>
     <None Include="res\shader\Fragment.frag" />
@@ -175,6 +178,13 @@
     <ClInclude Include="src\VertexArray.h" />
     <ClInclude Include="src\VertexBufferLayout.h" />
     <ClInclude Include="src\Texture.h" />
+    <ClInclude Include="src\test\Test.h" />
+    <ClInclude Include="src\test\TestClearColor.h" />
+    <ClInclude Include="src\test\TestRenderTexture.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <Image Include="res\textures\ChernoLogo.png" />
+    <Image Include="res\textures\HazelLogo.png" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">

+ 74 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/OpenGLStudy.vcxproj.filters

@@ -45,6 +45,36 @@
     <ClCompile Include="src\Texture.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
+    <ClCompile Include="src\vendor\imgui\imgui.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="src\vendor\imgui\imgui_demo.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="src\vendor\imgui\imgui_draw.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="src\vendor\imgui\imgui_impl_glfw.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="src\vendor\imgui\imgui_impl_opengl3.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="src\vendor\imgui\imgui_tables.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="src\vendor\imgui\imgui_widgets.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="src\test\Test.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="src\test\TestClearColor.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
+    <ClCompile Include="src\test\TestRenderTexture.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="res\shader\Vertex.vert">
@@ -79,5 +109,49 @@
     <ClInclude Include="src\Texture.h">
       <Filter>头文件</Filter>
     </ClInclude>
+    <ClInclude Include="src\vendor\imgui\imconfig.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="src\vendor\imgui\imgui.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="src\vendor\imgui\imgui_impl_glfw.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="src\vendor\imgui\imgui_impl_opengl3.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="src\vendor\imgui\imgui_impl_opengl3_loader.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="src\vendor\imgui\imgui_internal.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="src\vendor\imgui\imstb_rectpack.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="src\vendor\imgui\imstb_textedit.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="src\vendor\imgui\imstb_truetype.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="src\test\Test.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="src\test\TestClearColor.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+    <ClInclude Include="src\test\TestRenderTexture.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <Image Include="res\textures\ChernoLogo.png">
+      <Filter>资源文件</Filter>
+    </Image>
+    <Image Include="res\textures\HazelLogo.png">
+      <Filter>资源文件</Filter>
+    </Image>
   </ItemGroup>
 </Project>

+ 15 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/imgui.ini

@@ -18,3 +18,18 @@ Pos=60,60
 Size=198,71
 Collapsed=0
 
+[Window][Global Settings]
+Pos=271,13
+Size=346,93
+Collapsed=0
+
+[Window][ClearColor]
+Pos=230,126
+Size=376,32
+Collapsed=0
+
+[Window][Update Transition]
+Pos=158,80
+Size=393,81
+Collapsed=0
+

+ 152 - 107
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/Application.cpp

@@ -19,6 +19,9 @@
 #include "vendor/imgui/imgui_impl_glfw.h"
 #include "vendor/imgui/imgui_impl_opengl3.h"
 
+#include "test/TestClearColor.h"
+#include "test/TestRenderTexture.h"
+
 struct ImguiSettings
 {
 	glm::vec3 TransitaionA = glm::vec3(200, 100, 0);
@@ -80,6 +83,151 @@ void doImguiFrame(ImGuiIO& io)
 
 }
 
+void launch(GLFWwindow* window, ImGuiIO& io)
+{
+	// 设定宽高是 640, 480 比例是 4:3 
+	//glm::mat4 proj = glm::ortho(-4.0f, 4.0f, -3.0f, 3.0f, -1.0f, 1.0f);
+
+	glm::mat4 proj = glm::ortho(0.0f, 960.0f, 0.0f, 540.0f, -1.0f, 1.0f);
+	//glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(-100, 0, 0));	// 相机向左偏移 100
+	glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, 0));
+	glm::mat4 mvp = proj * view;
+
+	// 不使用MVP矩阵计算时 
+	//float positions[] = {
+	//	-0.5f, -0.5f, 0.0f, 0.0f,
+	//	 0.5f, -0.5f, 1.0f, 0.0f,
+	//	 0.5f,  0.5f, 1.0f, 1.0f,
+	//	-0.5f,  0.5f, 0.0f, 1.0f,
+	//};		
+	// 使用 MVP 矩阵计算
+	//float positions[] = {
+	//	100.0f, 100.0f, 0.0f, 0.0f,
+	//	700.0f, 100.0f, 1.0f, 0.0f,
+	//	700.0f, 400.0f, 1.0f, 1.0f,
+	//	100.0f, 400.0f, 0.0f, 1.0f,
+	//};
+	// 使用 MVP 矩阵计算 并以 (0,0) 为中心,长宽为 100
+	float positions[] = {
+		-50, -50, 0.0f, 0.0f,
+			50, -50, 1.0f, 0.0f,
+			50,  50, 1.0f, 1.0f,
+		-50,  50, 0.0f, 1.0f,
+	};
+
+	GLuint indeices[] = {
+		0, 1, 2,
+		2, 3, 0
+	};
+
+	glEnable(GL_BLEND);
+	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+	VertexArray va;
+
+	VertexBuffer vb(positions, sizeof(float) * 4 * 4);
+
+	VertexBufferLayout layout;
+	layout.Push<float>(2);	// 前两个是 顶点
+	layout.Push<float>(2);	// 后两个是 UV 坐标
+
+	va.AddBuffer(vb, layout);
+
+	IndexBuffer ibo(indeices, 6);
+
+	Texture texture("res/textures/ChernoLogo.png");
+	texture.Bind(0);
+
+	auto shader = Shader("res/shader/Vertex.vert", "res/shader/Fragment.frag");
+	shader.Bind();
+	shader.SetUniform1i("u_Texture", 0);
+
+	// 清除所有绑定关系
+	va.Unbind();
+	vb.UnBind();
+	ibo.Unbind();
+	shader.Unbind();
+
+	Renderer render;
+
+	GLfloat r = 0.0f;
+	GLfloat increment = 0.05f;
+	/* Loop until the user closes the window */
+	while (!glfwWindowShouldClose(window))
+	{
+		/* Render here */
+		//glClear(GL_COLOR_BUFFER_BIT);
+		render.Clear();
+
+		doImguiFrame(io);
+
+		//render.draw 里面已经绑定过了 不用再绑定
+		//va.Bind();
+		//ibo.Bind();
+
+		r += increment;
+		//shader.Bind();
+		//shader.SetUniform4f("u_Color", r, .5f, .5f, 1.0f);
+
+		if (r > 1.0f || r < 0.0f) {
+			increment *= -1;
+		}
+
+		//GL_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0));
+		glm::mat4 translationA = glm::translate(glm::mat4(1.0f), Settings.TransitaionA);
+		shader.SetUniformMat4f("u_MVP", mvp * translationA);
+		render.Draw(va, ibo, shader);
+
+		// 绘制第二张图片
+		glm::mat4 translationB = glm::translate(glm::mat4(1.0f), Settings.TransitaionB);
+		shader.SetUniformMat4f("u_MVP", mvp * translationB);
+		render.Draw(va, ibo, shader);
+
+		// Rendering
+		ImGui::Render();
+		ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
+
+		/* Swap front and back buffers */
+		glfwSwapBuffers(window);
+
+		/* Poll for and process events */
+		glfwPollEvents();
+	}
+}
+
+void launch2(GLFWwindow* window, ImGuiIO& io)
+{
+	//TestModule::TestClearColor TestApp;
+	TestModule::TestRenderTexture TestApp;
+
+	glEnable(GL_BLEND);
+	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+	TestApp.Init();
+
+	while (!glfwWindowShouldClose(window))
+	{
+		// 设置 ImGUI 新一帧
+		ImGui_ImplOpenGL3_NewFrame();
+		ImGui_ImplGlfw_NewFrame();
+		ImGui::NewFrame();
+
+		TestApp.OnUpdate(0.017f);
+		TestApp.OnRender();
+
+		TestApp.OnImGuiRender();
+
+		// 绘制 ImGUI
+		ImGui::Render();
+		ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
+
+		glfwSwapBuffers(window);
+		glfwPollEvents();
+	}
+
+	TestApp.Exit();
+}
+
 int main(void)
 {
 	GLFWwindow* window = nullptr;
@@ -128,115 +276,12 @@ int main(void)
 
 	//std::cout << glGetString(GL_VERSION) << std::endl;
 
-	// 设定宽高是 640, 480 比例是 4:3 
-	//glm::mat4 proj = glm::ortho(-4.0f, 4.0f, -3.0f, 3.0f, -1.0f, 1.0f);
+	// 添加测试模块之前的讲解案例
+	//launch(window, io);
 
-	glm::mat4 proj = glm::ortho(0.0f, 960.0f, 0.0f, 540.0f, -1.0f, 1.0f);
-	//glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(-100, 0, 0));	// 相机向左偏移 100
-	glm::mat4 view = glm::translate(glm::mat4(1.0f), glm::vec3(0, 0, 0));
-	glm::mat4 mvp = proj * view;
+	// 使用测试模块
+	launch2(window, io);
 
-	{
-		// 不使用MVP矩阵计算时 
-		//float positions[] = {
-		//	-0.5f, -0.5f, 0.0f, 0.0f,
-		//	 0.5f, -0.5f, 1.0f, 0.0f,
-		//	 0.5f,  0.5f, 1.0f, 1.0f,
-		//	-0.5f,  0.5f, 0.0f, 1.0f,
-		//};		
-		// 使用 MVP 矩阵计算
-		//float positions[] = {
-		//	100.0f, 100.0f, 0.0f, 0.0f,
-		//	700.0f, 100.0f, 1.0f, 0.0f,
-		//	700.0f, 400.0f, 1.0f, 1.0f,
-		//	100.0f, 400.0f, 0.0f, 1.0f,
-		//};
-		// 使用 MVP 矩阵计算 并以 (0,0) 为中心,长宽为 100
-		float positions[] = {
-			-50, -50, 0.0f, 0.0f,
-			 50, -50, 1.0f, 0.0f,
-			 50,  50, 1.0f, 1.0f,
-			-50,  50, 0.0f, 1.0f,
-		};
-
-		GLuint indeices[] = {
-			0, 1, 2,
-			2, 3, 0
-		};
-
-		glEnable(GL_BLEND);
-		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-		VertexArray va;
-
-		VertexBuffer vb(positions, sizeof(float) * 4 * 4);
-
-		VertexBufferLayout layout;
-		layout.Push<float>(2);	// 前两个是 顶点
-		layout.Push<float>(2);	// 后两个是 UV 坐标
-
-		va.AddBuffer(vb, layout);
-
-		IndexBuffer ibo(indeices, 6);
-
-		Texture texture("res/textures/ChernoLogo.png");
-		texture.Bind(0);
-
-		auto shader = Shader("res/shader/Vertex.vert", "res/shader/Fragment.frag");
-		shader.Bind();
-		shader.SetUniform1i("u_Texture", 0);
-
-		// 清除所有绑定关系
-		va.Unbind();
-		vb.UnBind();
-		ibo.Unbind();
-		shader.Unbind();
-
-		Renderer render;
-
-		GLfloat r = 0.0f;
-		GLfloat increment = 0.05f;
-		/* Loop until the user closes the window */
-		while (!glfwWindowShouldClose(window))
-		{
-			/* Render here */
-			//glClear(GL_COLOR_BUFFER_BIT);
-			render.Clear();
-
-			doImguiFrame(io);
-
-			va.Bind();
-			ibo.Bind();
-
-			r += increment;
-			//shader.Bind();
-			//shader.SetUniform4f("u_Color", r, .5f, .5f, 1.0f);
-
-			if (r > 1.0f || r < 0.0f) {
-				increment *= -1;
-			}
-
-			//GL_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0));
-			glm::mat4 translationA = glm::translate(glm::mat4(1.0f), Settings.TransitaionA);
-			shader.SetUniformMat4f("u_MVP", mvp * translationA);
-			render.Draw(va, ibo, shader);
-
-			// 绘制第二张图片
-			glm::mat4 translationB = glm::translate(glm::mat4(1.0f), Settings.TransitaionB);
-			shader.SetUniformMat4f("u_MVP", mvp * translationB);
-			render.Draw(va, ibo, shader);
-
-			// Rendering
-			ImGui::Render();
-			ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
-
-			/* Swap front and back buffers */
-			glfwSwapBuffers(window);
-
-			/* Poll for and process events */
-			glfwPollEvents();
-		}
-	}
 	glfwTerminate();
 	return 0;
 }

+ 1 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/IndexBuffer.h

@@ -9,6 +9,7 @@ private:
 
 public:
 	IndexBuffer(const GLuint* data, GLuint count);
+	IndexBuffer() = default;
 	~IndexBuffer();
 
 	void Bind() const;

+ 4 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/Shader.cpp

@@ -10,6 +10,10 @@ Shader::Shader(const std::string& vertexFile, const std::string& fragmentFile)
 	m_ShaderId = CreateShaderWithFile();
 }
 
+Shader::Shader()
+{
+}
+
 Shader::~Shader()
 {
 	glDeleteProgram(m_ShaderId);

+ 1 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/Shader.h

@@ -17,6 +17,7 @@ private:
 
 public:
 	Shader(const std::string& vertexFile, const std::string& fragmentFile);
+	Shader();
 	~Shader();
 
 	void Bind() const;

+ 1 - 1
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/Util.cpp

@@ -35,7 +35,7 @@ void LogError(unsigned int Line, const char* functionName) {
 			break;
 		}
 
-		__debugbreak();	// 中断函数 编译器强相关函数,gcc 没有
+		// __debugbreak();	// 中断函数 编译器强相关函数,gcc 没有
 
 		errorType = glGetError();
 	}

+ 1 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/VertexBuffer.h

@@ -8,6 +8,7 @@ private:
 
 public:
 	VertexBuffer(const void* data, GLuint size);
+	VertexBuffer() = default;
 	~VertexBuffer();
 
 	void Bind() const;

+ 6 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/test/Test.cpp

@@ -0,0 +1,6 @@
+#include "Test.h"
+
+void TestModule::Test::Init()
+{
+	m_MVP = glm::ortho(0.0f, 960.0f, 0.0f, 540.0f, -1.0f, 1.0f);
+}

+ 37 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/test/Test.h

@@ -0,0 +1,37 @@
+#pragma once
+
+#include "../vendor/glm/glm.hpp"
+#include "../vendor/glm/gtc/matrix_transform.hpp"
+
+#include "../vendor/imgui/imgui.h"
+#include "../vendor/imgui/imgui_impl_glfw.h"
+#include "../vendor/imgui/imgui_impl_opengl3.h"
+
+#include "../Util.h"
+#include "../VertexArray.h"
+#include "../VertexBuffer.h"
+#include "../VertexBufferLayout.h"
+#include "../IndexBuffer.h"
+#include "../Texture.h"
+#include "../Shader.h"
+#include "../Renderer.h"
+
+namespace TestModule {
+	class Test
+	{
+	public:
+		Test() = default;
+		virtual ~Test() = default;
+
+		virtual void Init();
+		virtual void Exit() {};
+
+		virtual void OnUpdate(float deltaTIme) {};
+		virtual void OnRender() {};
+		virtual void OnImGuiRender() {};
+	
+	protected:
+		glm::mat4 m_MVP;
+	};
+}
+

+ 20 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/test/TestClearColor.cpp

@@ -0,0 +1,20 @@
+#include "TestClearColor.h"
+#include "../Util.h"
+
+void TestModule::TestClearColor::OnUpdate(float deltaTIme)
+{
+
+}
+
+void TestModule::TestClearColor::OnRender()
+{
+	GL_CALL(glClearColor(m_ClearColor[0], m_ClearColor[1], m_ClearColor[2], m_ClearColor[3]));
+	GL_CALL(glClear(GL_COLOR_BUFFER_BIT));
+}
+
+void TestModule::TestClearColor::OnImGuiRender()
+{
+	ImGui::Begin("ClearColor");
+	ImGui::SliderFloat3("Transition A", m_ClearColor, 0.0f, 1.0f);
+	ImGui::End();
+}

+ 15 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/test/TestClearColor.h

@@ -0,0 +1,15 @@
+#pragma once
+#include "Test.h"
+
+namespace TestModule {
+    class TestClearColor : public Test
+    {
+	public:
+		virtual void OnUpdate(float deltaTIme);
+		virtual void OnRender();
+		virtual void OnImGuiRender();
+
+	private:
+		float m_ClearColor[4] = { 0.2f, 0.3f, 0.8f, 1.0f };
+    };
+};

+ 96 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/test/TestRenderTexture.cpp

@@ -0,0 +1,96 @@
+#include "TestRenderTexture.h"
+#include "xutility"
+
+TestModule::TestRenderTexture::~TestRenderTexture()
+{
+	if(m_va != nullptr) delete m_va;
+	if(m_ibo != nullptr) delete m_ibo;
+	if(m_vb != nullptr) delete m_vb;
+	if(m_shader != nullptr) delete m_shader;
+	if(m_texture != nullptr) delete m_texture;
+
+	m_texture = nullptr;
+	m_va = nullptr;
+	m_ibo = nullptr;
+	m_vb = nullptr;
+	m_shader = nullptr;
+}
+
+void TestModule::TestRenderTexture::Init()
+{
+    Test::Init();
+
+	float positions[] = {
+		-50, -50, 0.0f, 0.0f,
+		50, -50, 1.0f, 0.0f,
+		50,  50, 1.0f, 1.0f,
+		-50,  50, 0.0f, 1.0f,
+	};
+
+	GLuint indeices[] = {
+		0, 1, 2,
+		2, 3, 0
+	};
+
+	// 顶点数组	
+	m_va = new VertexArray();
+
+	// 顶点缓冲 
+	m_vb = new VertexBuffer(positions, sizeof(float) * 4 * 4);
+
+	// 布局信息
+	VertexBufferLayout layout;
+	layout.Push<float>(2);	// 前两个是 顶点
+	layout.Push<float>(2);	// 后两个是 UV 坐标
+
+	m_va->AddBuffer(*m_vb, layout);
+
+	// 索引缓冲
+	m_ibo = new IndexBuffer(indeices, 6);
+
+	m_texture = new Texture("res/textures/ChernoLogo.png");
+	m_texture->Bind(0);
+
+	m_shader = new Shader("res/shader/Vertex.vert", "res/shader/Fragment.frag");
+	m_shader->Bind();
+	m_shader->SetUniform1i("u_Texture", 0);
+
+	// 清除所有绑定关系
+	m_va->Unbind();
+	m_vb->UnBind();
+	m_ibo->Unbind();
+	m_shader->Unbind();
+}
+
+void TestModule::TestRenderTexture::Exit()
+{
+}
+
+void TestModule::TestRenderTexture::OnUpdate(float deltaTime)
+{
+}
+
+void TestModule::TestRenderTexture::OnRender()
+{
+	static glm::mat4 mvp = glm::ortho(0.0f, 960.0f, 0.0f, 540.0f, -1.0f, 1.0f);
+
+	m_render.Clear();
+
+	glm::mat4 translationA = glm::translate(glm::mat4(1.0f), m_TransitaionA);
+	m_shader->SetUniformMat4f("u_MVP", mvp * translationA);
+	m_render.Draw(*m_va, *m_ibo, *m_shader);
+
+	// 绘制第二张图片
+	glm::mat4 translationB = glm::translate(glm::mat4(1.0f), m_TransitaionB);
+	m_shader->SetUniformMat4f("u_MVP", mvp * translationB);
+	m_render.Draw(*m_va, *m_ibo, *m_shader);
+
+}
+
+void TestModule::TestRenderTexture::OnImGuiRender()
+{
+    ImGui::Begin("Update Transition");
+	ImGui::SliderFloat3("Transition A", &m_TransitaionA.x, 0.0f, 500.0f);
+	ImGui::SliderFloat3("Transition B", &m_TransitaionB.x, 0.0f, 500.0f);
+	ImGui::End();
+}

+ 30 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/test/TestRenderTexture.h

@@ -0,0 +1,30 @@
+#pragma once
+#include "Test.h"
+
+namespace TestModule {
+    class TestRenderTexture : public Test
+    {
+    public:
+        virtual ~TestRenderTexture();
+
+        virtual void Init() override;
+        virtual void Exit() override;
+
+        virtual void OnUpdate(float deltaTime) override;
+        virtual void OnRender() override;
+        virtual void OnImGuiRender() override;
+
+    private:
+        glm::vec3 m_TransitaionA = glm::vec3(200, 100, 0);
+        glm::vec3 m_TransitaionB = glm::vec3(400, 300, 0);
+        
+        VertexArray* m_va{ nullptr };
+        IndexBuffer* m_ibo{ nullptr };
+        VertexBuffer* m_vb{ nullptr };
+        Shader* m_shader{ nullptr };
+        Texture* m_texture{ nullptr };
+
+        Renderer m_render;
+    };
+};
+