首页
/ Hazel Engine深度剖析:从入门到精通的2D/3D渲染引擎架构详解

Hazel Engine深度剖析:从入门到精通的2D/3D渲染引擎架构详解

2026-02-05 05:17:38作者:劳婵绚Shirley

引言:为什么选择Hazel Engine?

你是否还在为选择合适的游戏引擎而烦恼?是否想要深入了解游戏引擎的内部工作原理?Hazel Engine将为你提供一个理想的学习和开发平台。作为一款由知名开发者TheCherno打造的开源游戏引擎,Hazel Engine不仅具备强大的2D/3D渲染能力,还致力于成为游戏引擎设计与架构的教育工具。通过本文,你将全面了解Hazel Engine的架构设计、核心模块、使用方法以及未来发展方向,让你从入门到精通,轻松掌握这款强大引擎的方方面面。

Hazel Engine概述

Hazel Engine是一个主要针对Windows平台的早期交互式应用和渲染引擎。虽然目前实现的功能还不算丰富,但几乎所有代码都伴随着YouTube视频教程,你可以在thecherno.com/engine找到相关内容。Hazel Engine的开发理念是双重的:一方面打造强大的3D引擎,另一方面作为游戏引擎设计和架构的教学工具。因此,该仓库的开发速度相对较慢,因为所有内容都需要在镜头前进行教学和实现。

Hazel Engine Logo

Hazel Engine的源代码托管在https://gitcode.com/gh_mirrors/ha/Hazel,遵循MIT许可证开源。引擎的主要特点包括:

  • 快速2D渲染(UI、粒子、精灵等)
  • 高保真基于物理的3D渲染(将在2D之后扩展)
  • 跨平台支持(Windows、Mac、Linux、Android和iOS)
  • 原生渲染API支持(DirectX、Vulkan、Metal)
  • 功能齐全的查看器和编辑器应用程序
  • 完全脚本化的交互和行为
  • 集成第三方2D和3D物理引擎
  • 程序化地形和世界生成
  • 人工智能系统
  • 音频系统

快速开始:Hazel Engine环境搭建

要开始使用Hazel Engine,你需要按照以下步骤进行环境配置:

1. 下载仓库

首先,使用以下命令克隆仓库:

git clone --recursive https://gitcode.com/gh_mirrors/ha/Hazel

如果你之前非递归克隆了仓库,可以使用以下命令克隆必要的子模块:

git submodule update --init

2. 配置依赖项

  1. 运行位于scripts文件夹中的Setup.bat文件。这将下载项目所需的先决条件(如果尚未存在)。
  2. 其中一个先决条件是Vulkan SDK。如果尚未安装,脚本将执行VulkanSDK.exe文件,并提示用户安装SDK。
  3. 安装完成后,再次运行Setup.bat文件。如果Vulkan SDK安装正确,它将下载Vulkan SDK调试库(这可能需要较长时间)。
  4. 下载并解压缩文件后,Win-GenProjects.bat脚本文件将自动执行,为用户生成Visual Studio解决方案文件。

如果进行了更改,或者想要重新生成项目文件,请重新运行scripts文件夹中的Win-GenProjects.bat脚本文件。

核心架构:Hazel Engine的分层设计

Hazel Engine采用了清晰的分层架构,使得代码组织有序且易于维护。下面我们将深入探讨引擎的核心模块。

应用程序核心(Application Core)

应用程序核心是Hazel Engine的基础,负责管理应用程序的生命周期、窗口创建和事件处理。核心类Application定义在Hazel/src/Hazel/Core/Application.h中,它包含了应用程序的主要逻辑。

Application类的主要功能包括:

  • 应用程序初始化和关闭
  • 事件处理
  • 图层管理
  • 主循环运行

以下是Application类的关键代码片段:

class Application
{
public:
    Application(const ApplicationSpecification& specification);
    virtual ~Application();

    void OnEvent(Event& e);
    void PushLayer(Layer* layer);
    void PushOverlay(Layer* layer);
    Window& GetWindow() { return *m_Window; }
    void Close();
    static Application& Get() { return *s_Instance; }
    const ApplicationSpecification& GetSpecification() const { return m_Specification; }
    void SubmitToMainThread(const std::function<void()>& function);
private:
    void Run();
    bool OnWindowClose(WindowCloseEvent& e);
    bool OnWindowResize(WindowResizeEvent& e);
    void ExecuteMainThreadQueue();
private:
    ApplicationSpecification m_Specification;
    Scope<Window> m_Window;
    ImGuiLayer* m_ImGuiLayer;
    bool m_Running = true;
    bool m_Minimized = false;
    LayerStack m_LayerStack;
    float m_LastFrameTime = 0.0f;
    std::vector<std::function<void()>> m_MainThreadQueue;
    std::mutex m_MainThreadQueueMutex;
private:
    static Application* s_Instance;
    friend int ::main(int argc, char** argv);
};

渲染系统(Renderer)

渲染系统是Hazel Engine的核心模块之一,负责处理2D和3D图形的渲染。渲染系统的主要类Renderer定义在Hazel/src/Hazel/Renderer/Renderer.h中。

Renderer类提供了以下核心功能:

  • 初始化和关闭渲染系统
  • 窗口大小调整处理
  • 场景渲染开始和结束
  • 提交渲染命令

以下是Renderer类的关键代码片段:

class Renderer
{
public:
    static void Init();
    static void Shutdown();
    
    static void OnWindowResize(uint32_t width, uint32_t height);

    static void BeginScene(OrthographicCamera& camera);
    static void EndScene();

    static void Submit(const Ref<Shader>& shader, const Ref<VertexArray>& vertexArray, const glm::mat4& transform = glm::mat4(1.0f));

    static RendererAPI::API GetAPI() { return RendererAPI::GetAPI(); }
private:
    struct SceneData
    {
        glm::mat4 ViewProjectionMatrix;
    };

    static Scope<SceneData> s_SceneData;
};

Hazel Engine的渲染系统支持多种渲染API,包括DirectX、Vulkan和Metal,这使得引擎能够在不同平台上发挥最佳性能。

场景系统(Scene)

场景系统负责管理游戏世界中的实体和组件。Scene类定义在Hazel/src/Hazel/Scene/Scene.h中,它使用ECS(实体组件系统)架构来组织游戏对象。

Scene类的主要功能包括:

  • 创建和销毁实体
  • 实体组件管理
  • 场景更新和渲染
  • 物理世界管理

以下是Scene类的关键代码片段:

class Scene
{
public:
    Scene();
    ~Scene();

    static Ref<Scene> Copy(Ref<Scene> other);

    Entity CreateEntity(const std::string& name = std::string());
    Entity CreateEntityWithUUID(UUID uuid, const std::string& name = std::string());
    void DestroyEntity(Entity entity);

    void OnRuntimeStart();
    void OnRuntimeStop();

    void OnSimulationStart();
    void OnSimulationStop();

    void OnUpdateRuntime(Timestep ts);
    void OnUpdateSimulation(Timestep ts, EditorCamera& camera);
    void OnUpdateEditor(Timestep ts, EditorCamera& camera);
    void OnViewportResize(uint32_t width, uint32_t height);

    Entity DuplicateEntity(Entity entity);

    Entity FindEntityByName(std::string_view name);
    Entity GetEntityByUUID(UUID uuid);

    Entity GetPrimaryCameraEntity();

    bool IsRunning() const { return m_IsRunning; }
    bool IsPaused() const { return m_IsPaused; }

    void SetPaused(bool paused) { m_IsPaused = paused; }

    void Step(int frames = 1);

    template<typename... Components>
    auto GetAllEntitiesWith()
    {
        return m_Registry.view<Components...>();
    }
private:
    template<typename T>
    void OnComponentAdded(Entity entity, T& component);

    void OnPhysics2DStart();
    void OnPhysics2DStop();

    void RenderScene(EditorCamera& camera);
private:
    entt::registry m_Registry;
    uint32_t m_ViewportWidth = 0, m_ViewportHeight = 0;
    bool m_IsRunning = false;
    bool m_IsPaused = false;
    int m_StepFrames = 0;

    b2World* m_PhysicsWorld = nullptr;

    std::unordered_map<UUID, entt::entity> m_EntityMap;

    friend class Entity;
    friend class SceneSerializer;
    friend class SceneHierarchyPanel;
};

编辑器使用:Hazelnut编辑器详解

Hazel Engine附带了一个名为Hazelnut的编辑器应用程序,它允许开发者创建和编辑游戏场景、管理资源等。Hazelnut编辑器的源代码位于Hazelnut/src/目录下。

编辑器界面

Hazelnut编辑器的主要界面由多个面板组成,包括:

  1. 场景层级面板(Scene Hierarchy Panel):显示场景中的实体层级结构,允许选择和编辑实体。相关代码位于Hazelnut/src/Panels/SceneHierarchyPanel.cppHazelnut/src/Panels/SceneHierarchyPanel.h

  2. 内容浏览器面板(Content Browser Panel):允许浏览和管理项目资源,如纹理、模型、脚本等。相关代码位于Hazelnut/src/Panels/ContentBrowserPanel.cppHazelnut/src/Panels/ContentBrowserPanel.h

  3. 属性面板(Properties Panel):显示和编辑选中实体的组件属性。

  4. 视口面板(Viewport Panel):实时预览场景渲染结果,支持交互操作。

场景编辑工作流程

使用Hazelnut编辑器创建游戏场景的基本流程如下:

  1. 创建实体:点击场景层级面板中的"创建实体"按钮,选择实体类型(如空实体、2D精灵、3D模型等)。

  2. 添加组件:选中实体后,在属性面板中点击"添加组件"按钮,选择要添加的组件(如变换、渲染器、碰撞体等)。

  3. 编辑属性:在属性面板中调整实体和组件的属性,如位置、旋转、缩放、材质等。

  4. 保存场景:使用菜单栏中的"保存"选项保存场景,场景文件将以.hazel扩展名保存在项目的Assets/Scenes目录下。例如,Hazelnut/SandboxProject/Assets/Scenes/Example.hazel是一个示例场景文件。

  5. 运行游戏:点击编辑器工具栏中的"播放"按钮,在编辑器中预览游戏运行效果。

实践案例:使用Hazel Engine创建简单游戏

为了帮助你更好地理解Hazel Engine的使用方法,我们将通过一个简单的案例来演示如何使用引擎创建一个基本的2D游戏。

1. 创建Sandbox项目

Hazel Engine提供了一个Sandbox项目作为起点,你可以在Sandbox/目录下找到它。Sandbox项目包含了一些示例代码和资源,如Sandbox/src/Sandbox2D.cpp展示了如何创建一个简单的2D场景。

2. 添加精灵和物理

在Sandbox2D类中,你可以看到如何创建精灵实体并添加物理组件:

void Sandbox2D::OnCreate()
{
    HZ_PROFILE_FUNCTION();

    m_CheckerboardTexture = Hazel::Texture2D::Create("assets/textures/Checkerboard.png");
    
    m_Scene = Hazel::CreateRef<Hazel::Scene>();

    auto square = m_Scene->CreateEntity("Square");
    square.AddComponent<Hazel::SpriteRendererComponent>(glm::vec4{ 0.8f, 0.2f, 0.3f, 1.0f });
    
    auto cameraEntity = m_Scene->CreateEntity("Camera");
    cameraEntity.AddComponent<Hazel::CameraComponent>();
}

3. 处理输入和更新游戏逻辑

在Sandbox2D类的OnUpdate方法中,你可以处理输入并更新游戏逻辑:

void Sandbox2D::OnUpdate(Hazel::Timestep ts)
{
    HZ_PROFILE_FUNCTION();

    // 更新相机位置
    if (Hazel::Input::IsKeyPressed(HZ_KEY_A))
        m_CameraPosition.x -= m_CameraMoveSpeed * ts;
    else if (Hazel::Input::IsKeyPressed(HZ_KEY_D))
        m_CameraPosition.x += m_CameraMoveSpeed * ts;

    if (Hazel::Input::IsKeyPressed(HZ_KEY_W))
        m_CameraPosition.y += m_CameraMoveSpeed * ts;
    else if (Hazel::Input::IsKeyPressed(HZ_KEY_S))
        m_CameraPosition.y -= m_CameraMoveSpeed * ts;

    // 更新场景
    m_Scene->OnUpdateEditor(ts, m_Camera);

    // 渲染
    Hazel::Renderer2D::BeginScene(m_Camera);
    
    // 绘制精灵和其他2D元素
    Hazel::Renderer2D::DrawQuad(glm::vec2(0.0f, 0.0f), glm::vec2(1.0f, 1.0f), m_CheckerboardTexture, 10.0f);
    
    Hazel::Renderer2D::EndScene();
}

4. 运行和测试游戏

完成代码编写后,你可以使用Hazelnut编辑器打开Sandbox项目,并运行游戏进行测试。Sandbox项目的配置文件位于Hazelnut/SandboxProject/Sandbox.hproj

未来展望:Hazel Engine的发展路线图

Hazel Engine的开发团队制定了清晰的发展路线图,计划在未来实现更多强大功能。以下是一些主要的短期和长期目标:

短期目标(2020年底前)

  • 使用Hazel游戏引擎制作一款游戏
  • 实现完整的2D工作流程:
    • 使用Hazelnut(Hazel编辑器)设计游戏场景
    • 在Hazelnut中测试游戏,包括保存/加载创建的游戏
    • 在Sandbox中加载和玩游戏
  • 支持在所有桌面平台(Windows、Mac和Linux)上运行游戏

长期目标

  • 完善3D渲染系统,实现基于物理的渲染(PBR)
  • 增强AI系统,支持复杂的游戏逻辑和行为
  • 开发更强大的音频系统,支持3D空间音频
  • 优化移动端性能,提供更好的触摸控制支持
  • 扩展编辑器功能,支持更多高级特性如动画编辑、粒子系统设计等

总结

Hazel Engine是一款功能强大且易于学习的开源游戏引擎,它不仅提供了高效的2D/3D渲染能力,还致力于成为游戏引擎设计与架构的教育工具。通过本文的介绍,你已经了解了Hazel Engine的基本架构、环境搭建、核心模块和使用方法。

无论你是游戏开发新手还是有经验的开发者,Hazel Engine都能为你提供一个理想的平台来实现你的创意。如果你想深入学习游戏引擎开发,Hazel Engine的源代码和配套视频教程将是你宝贵的学习资源。

现在,是时候动手尝试使用Hazel Engine创建你自己的游戏了!祝你在游戏开发的道路上取得成功!

如果你对Hazel Engine有任何疑问或建议,欢迎参与社区讨论,与其他开发者分享你的经验和见解。让我们一起为Hazel Engine的发展贡献力量!

登录后查看全文
热门项目推荐
相关项目推荐