Haxel Engine learning 18 -- Renderer Flow and Submission

本文介绍了一个3D Cube渲染的基本步骤,包括初始化渲染环境、设置摄像机和光源、提交渲染对象等关键环节,并展示了如何组织代码来实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cherno视频:https://www.youtube.com/watch?v=akxevYYWd9g&list=PLlrATfBNZ98dC-V-N3m0Go4deliWHPFwT&index=33

完整代码:https://github.com/DXT00/Hazel_study/tree/c63132b50cd6a94d151cab2faff84b9ec15c310b

A Renderer : (比如渲染一个 3D  Cube)

分为两部分:

1.The Object

2.The Environment

需要一下这些:

1.The Object

A VertexBuffer-->定义顶点属性

A IndexBuffer-->定义顶点间的关系

A Shader--->着色

2.The Environment

A Camera System (A Projection Matrix and  A View Matrix)

The position of the Cube in World Space (A Transformation Matrix)

Surface Material

Environment (lights) irradiance map


Command:

1.Renderer.BeginSences(lights,camera,environment)

 -- include Camera and Environment

2.Dispatch DrawCall (DrawCall 调度,通过Command队列)

Renderer.SubmitGeo()

Renderer.SubmitMesh()

......

3.Renderer.EndSences()


原Application::Run: 

	void Application::Run()
	{
		while (m_Running)
		{
			glClearColor(0.1f, 0.1f, 0.1f, 1);
			glClear(GL_COLOR_BUFFER_BIT);

			
			m_SquareShader->Bind();
			m_SquareVA->Bind();
			glDrawElements(GL_TRIANGLES, m_SquareVA->GetIndexBuffer()->GetCount(), GL_UNSIGNED_INT, nullptr);

			m_Shader->Bind();
			m_VertexArray->Bind();
			glDrawElements(GL_TRIANGLES, m_VertexArray->GetIndexBuffer()->GetCount(), GL_UNSIGNED_INT, nullptr);



			for (Layer* layer : m_LayerStack)
				layer->OnUpdate();

			m_ImGuiLayer->Begin();
			for (Layer* layer : m_LayerStack)
				layer->OnImGuiRender();
			m_ImGuiLayer->End();

			m_Window->OnUpdate();
		}
	}

现添加Renderer:

void Application::Run()
	{
		while (m_Running)
		{
			
			RendereCommand::SetClearColor();
			RendereCommand::Clear();

			Renderer::BeginScene();
			
			m_SquareShader->Bind();
			m_SquareVA->Bind();
			Renderer::Submit(m_SquareVA);
			
			m_Shader->Bind();
			m_VertexArray->Bind();
			Renderer::Submit(m_VertexArray);
			

			Renderer::EndScene();

			for (Layer* layer : m_LayerStack)
				layer->OnUpdate();

			m_ImGuiLayer->Begin();
			for (Layer* layer : m_LayerStack)
				layer->OnImGuiRender();
			m_ImGuiLayer->End();

			m_Window->OnUpdate();
		}
	}

3个类:

Renderer  --->RenderCommand--->RendererAPI

Renderer  提交渲染命令给RenderCommand

RenderCommand通过调用RendererAPI执行渲染命令!

 

Renderer.h

#pragma once
#include "RenderCommand.h"
namespace Hazel {

	class Renderer {
	public:
		static void BeginScene();
		static void EndScene();

		//dispatch to the RenderCommand,and submit it into Command Queue!
		static void Submit(const std::shared_ptr<VertexArray>& vertexArray);

		inline static RendererAPI::API GetAPI() { return RendererAPI::GetAPI(); }

	};

}

 

RenderCommand.h 每个命令只执行一个操作!RenderCommand包含指向一个RendererAPI的指针

#pragma once
#include"RendererAPI.h"
namespace Hazel {
	//static wrapper for the actual implementation
	//One Command do one thing!
	class RenderCommand
	{
	public:
		inline static void DrawIndex(const std::shared_ptr<VertexArray>& vertexArray) {
			s_RenderAPI->DrawIndex(vertexArray);
		}
		inline static void SetClearColor(const glm::vec4& color) {
			s_RenderAPI->SetClearColor(color);
		}
		inline static void Clear() {
			s_RenderAPI->Clear();
		}

	
	private:
		//包含指向一个RendererAPI的指针,这个指针可以指向OpenGLRendererAPI,或者DirectXRendrerAPI...
		//s_RenderAPI is a pointer to a class with no member! so it is just one Byte memery leak
		static RendererAPI* s_RenderAPI;
	};

}

RenderCommand.cpp:

#include "hzpch.h"
#include "RenderCommand.h"
#include "Platform/OpenGL/OpenGLRendererAPI.h"
namespace Hazel {

	RendererAPI* RenderCommand::s_RenderAPI = new OpenGLRendererAPI;


}

 


RendererAPI.h是个抽象类,子类由OpenGLRendererAPI, DirectXRendererAPI..

#pragma once
#include "VertexArray.h"
#include "glm/glm.hpp"
namespace Hazel {
	class RendererAPI //just an Interface 抽象类
	{
	public:

		enum class API {
			None = 0, OpenGL = 1
		}; 

		RendererAPI();
		virtual ~RendererAPI();

		static const API &GetAPI(){return s_API;}
		virtual void SetClearColor(const glm::vec4& color) = 0;
		virtual void Clear() = 0;

		virtual void DrawIndex(const std::shared_ptr<VertexArray> &vertexArray)=0;

		

	private:
		static API s_API;

	};


}

Application.cpp

	void Application::Run()
	{
		while (m_Running)
		{
			
			RenderCommand::SetClearColor({ 0.1f, 0.1f, 0.1f, 1 });
			RenderCommand::Clear();
			Renderer::BeginScene();
			
			m_SquareShader->Bind();
			Renderer::Submit(m_SquareVA);

			m_Shader->Bind();
			Renderer::Submit(m_VertexArray);

			Renderer::EndScene();

			for (Layer* layer : m_LayerStack)
				layer->OnUpdate();

			m_ImGuiLayer->Begin();
			for (Layer* layer : m_LayerStack)
				layer->OnImGuiRender();
			m_ImGuiLayer->End();

			m_Window->OnUpdate();
		}
	}

 

F5成功运行:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值