Bläddra i källkod

feat: 添加 Shader 的简单封装

nicetry12138 1 år sedan
förälder
incheckning
e4956788a2

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

@@ -1116,3 +1116,7 @@ private:
 
 > 后续可以扩展 `SetUniform` 一系列函数,比如 `1f`、`2f`、`3f` 等
 
+### 简单封装渲染器
+
+什么时候清理调用 `glClear`、`glDrawElements` 等函数,这些其实都是渲染器来处理的
+

+ 4 - 2
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/OpenGLStudy.vcxproj

@@ -136,9 +136,10 @@
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
+    <ClCompile Include="src\Renderer.cpp" />
     <ClCompile Include="src\Shader.cpp" />
     <ClCompile Include="src\IndexBuffer.cpp" />
-    <ClCompile Include="src\Renderer.cpp" />
+    <ClCompile Include="src\Util.cpp" />
     <ClCompile Include="src\Application.cpp" />
     <ClCompile Include="src\VertexBuffer.cpp" />
     <ClCompile Include="src\VertexArray.cpp" />
@@ -149,9 +150,10 @@
     <None Include="src\Vertex.vert" />
   </ItemGroup>
   <ItemGroup>
+    <ClInclude Include="src\Renderer.h" />
     <ClInclude Include="src\Shader.h" />
     <ClInclude Include="src\IndexBuffer.h" />
-    <ClInclude Include="src\Renderer.h" />
+    <ClInclude Include="src\Util.h" />
     <ClInclude Include="src\VertexBuffer.h" />
     <ClInclude Include="src\VertexArray.h" />
     <ClInclude Include="src\VertexBufferLayout.h" />

+ 8 - 3
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/Application.cpp

@@ -3,12 +3,13 @@
 #include <iostream>
 #include <fstream>
 
-#include "Renderer.h"
+#include "Util.h"
 #include "VertexBuffer.h"
 #include "IndexBuffer.h"
 #include "VertexArray.h"
 #include "VertexBufferLayout.h"
 #include "Shader.h"
+#include "Renderer.h"
 
 int main(void)
 {
@@ -72,13 +73,16 @@ int main(void)
 		vb.UnBind();
 		ibo.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);
+			//glClear(GL_COLOR_BUFFER_BIT);
+			render.Clear();
 
 			va.Bind();
 			ibo.Bind();
@@ -91,7 +95,8 @@ int main(void)
 				increment *= -1;
 			}
 
-			GL_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0));
+			//GL_CALL(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0));
+			render.Draw(va, ibo, shader);
 
 			/* Swap front and back buffers */
 			glfwSwapBuffers(window);

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

@@ -1,5 +1,5 @@
 #include "IndexBuffer.h"
-#include "Renderer.h"
+#include "Util.h"
 
 IndexBuffer::IndexBuffer(const GLuint* data, GLuint count) 
 {

+ 14 - 38
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/Renderer.cpp

@@ -1,42 +1,18 @@
 #include "Renderer.h"
-#include <iostream>
-#include <fstream>
+#include "VertexArray.h"
+#include "IndexBuffer.h"
+#include "Shader.h"
 
-void GLClearError() {
-	while (glGetError() != GL_NO_ERROR);
-}
-
-void LogError(unsigned int Line, const char* functionName) {
-	GLuint errorType = glGetError();
-	while (errorType != GL_NO_ERROR) {
-		std::cout << __FILE__ << " Line: " << Line << " Function Name: " << functionName << " ";
-		switch (errorType)
-		{
-		case GL_INVALID_ENUM:
-			std::cout << "LogError: " << "GL_INVALID_ENUM" << std::endl;
-			break;
-		case GL_INVALID_VALUE:
-			std::cout << "LogError: " << "GL_INVALID_VALUE" << std::endl;
-			break;
-		case GL_INVALID_OPERATION:
-			std::cout << "LogError: " << "GL_INVALID_OPERATION" << std::endl;
-			break;
-		case GL_INVALID_FRAMEBUFFER_OPERATION:
-			std::cout << "LogError: " << "GL_INVALID_FRAMEBUFFER_OPERATION" << std::endl;
-			break;
-		case GL_OUT_OF_MEMORY:
-			std::cout << "LogError: " << "GL_OUT_OF_MEMORY" << std::endl;
-			break;
-		case GL_STACK_UNDERFLOW:
-			std::cout << "LogError: " << "GL_STACK_UNDERFLOW" << std::endl;
-			break;
-		case GL_STACK_OVERFLOW:
-			std::cout << "LogError: " << "GL_STACK_OVERFLOW" << std::endl;
-			break;
-		}
+void Renderer::Draw(const VertexArray& va, const IndexBuffer& ib, const Shader& shader) const
+{
+	shader.Bind();
+	va.Bind();
+	ib.Bind();
 
-		__debugbreak();	// 中断函数 编译器强相关函数,gcc 没有
+	GL_CALL(glDrawElements(GL_TRIANGLES, ib.GetCount(), GL_UNSIGNED_INT, nullptr));
+}
 
-		errorType = glGetError();
-	}
-}
+void Renderer::Clear() const
+{
+	GL_CALL(glClear(GL_COLOR_BUFFER_BIT));
+}

+ 10 - 15
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/Renderer.h

@@ -1,20 +1,15 @@
 #pragma once
-#include <GL/glew.h>
-#include <GLFW/glfw3.h>
 
-#define GL_CHECK_ERROR do { LogError(__LINE__); }while(0);
-#define GL_CLEAR_ERROR do { GLClearError(); } while(0);
+class VertexArray;
+class IndexBuffer;
+class Shader;
 
-#define GL_CALL(x) do {			\
-	GLClearError();				\
-	x;							\
-	LogError(__LINE__, #x);		\
-} while (0);					\
+class Renderer
+{
+public:
+	void Draw(const VertexArray& va, const IndexBuffer& ib, const Shader& shader) const;
+	void Clear() const;
+private:
 
-const int gWidth = 640;
-const int gHeight = 480;
+};
 
-// 清除所有错误
-void GLClearError();
-// 输出当前错误
-void LogError(unsigned int Line, const char* functionName = nullptr);

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

@@ -1,5 +1,5 @@
 #pragma once
-#include "Renderer.h"
+#include "Util.h"
 #include <string>
 #include <unordered_map>
 

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

@@ -0,0 +1,42 @@
+#include "Util.h"
+#include <iostream>
+#include <fstream>
+
+void GLClearError() {
+	while (glGetError() != GL_NO_ERROR);
+}
+
+void LogError(unsigned int Line, const char* functionName) {
+	GLuint errorType = glGetError();
+	while (errorType != GL_NO_ERROR) {
+		std::cout << __FILE__ << " Line: " << Line << " Function Name: " << functionName << " ";
+		switch (errorType)
+		{
+		case GL_INVALID_ENUM:
+			std::cout << "LogError: " << "GL_INVALID_ENUM" << std::endl;
+			break;
+		case GL_INVALID_VALUE:
+			std::cout << "LogError: " << "GL_INVALID_VALUE" << std::endl;
+			break;
+		case GL_INVALID_OPERATION:
+			std::cout << "LogError: " << "GL_INVALID_OPERATION" << std::endl;
+			break;
+		case GL_INVALID_FRAMEBUFFER_OPERATION:
+			std::cout << "LogError: " << "GL_INVALID_FRAMEBUFFER_OPERATION" << std::endl;
+			break;
+		case GL_OUT_OF_MEMORY:
+			std::cout << "LogError: " << "GL_OUT_OF_MEMORY" << std::endl;
+			break;
+		case GL_STACK_UNDERFLOW:
+			std::cout << "LogError: " << "GL_STACK_UNDERFLOW" << std::endl;
+			break;
+		case GL_STACK_OVERFLOW:
+			std::cout << "LogError: " << "GL_STACK_OVERFLOW" << std::endl;
+			break;
+		}
+
+		__debugbreak();	// 中断函数 编译器强相关函数,gcc 没有
+
+		errorType = glGetError();
+	}
+}

+ 20 - 0
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/Util.h

@@ -0,0 +1,20 @@
+#pragma once
+#include <GL/glew.h>
+#include <GLFW/glfw3.h>
+
+#define GL_CHECK_ERROR do { LogError(__LINE__); }while(0);
+#define GL_CLEAR_ERROR do { GLClearError(); } while(0);
+
+#define GL_CALL(x) do {			\
+	GLClearError();				\
+	x;							\
+	LogError(__LINE__, #x);		\
+} while (0);					\
+
+const int gWidth = 640;
+const int gHeight = 480;
+
+// 清除所有错误
+void GLClearError();
+// 输出当前错误
+void LogError(unsigned int Line, const char* functionName = nullptr);

+ 2 - 2
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/VertexArray.cpp

@@ -29,12 +29,12 @@ void VertexArray::AddBuffer(const VertexBuffer& vb, const VertexBufferLayout& la
 	}
 }
 
-void VertexArray::Bind()
+void VertexArray::Bind() const
 {
 	GL_CALL(glBindVertexArray(m_RendererId));
 }
 
-void VertexArray::Unbind()
+void VertexArray::Unbind() const
 {
 	GL_CALL(glBindVertexArray(0));
 }

+ 3 - 3
图形学/OpenGL学习/src/OpenGLStudy/OpenGLStudy/src/VertexArray.h

@@ -1,5 +1,5 @@
 #pragma once
-#include "Renderer.h"
+#include "Util.h"
 
 class VertexBuffer;
 class VertexBufferLayout;
@@ -15,7 +15,7 @@ public:
 
 	void AddBuffer(const VertexBuffer& vb, const VertexBufferLayout& layout);
 
-	void Bind();
-	void Unbind();
+	void Bind() const;
+	void Unbind() const;
 };
 

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

@@ -1,5 +1,5 @@
 #include "VertexBuffer.h"
-#include "Renderer.h"
+#include "Util.h"
 
 VertexBuffer::VertexBuffer(const void* data, GLuint size)
 {