feat: 搭建 Vulkan 1.4 渲染器骨架,绘制旋转 3D 立方体
使用 Vulkan 1.4 现代路径初始化引擎骨架: - 用 Shader Object (VK_EXT_shader_object) 替代传统 VkPipeline - 用 Dynamic Rendering 替代 RenderPass/Framebuffer - 用 Synchronization2 管理 barrier 核心模块: - Window:GLFW 封装,GLFW_NO_API 模式,兼容 Wayland - Log:spdlog 封装 - Types:u32/u64/f32 类型别名 Vulkan 后端: - Device:Instance、PhysicalDevice、LogicalDevice、Queue 及 feature 查询 - Swapchain:Image、ImageView、DepthBuffer、Recreate - ShaderManager:SPIR-V 加载与 ShaderEXT 创建 - CommandManager:CommandPool 与主 CommandBuffer - SyncManager:per-frame Fence 与 ImageAvailable semaphore,per-image RenderFinished semaphore,2 frames in flight - MemoryAllocator:内存子分配器,256MB block,persistent mapping - Buffer:VertexBuffer、IndexBuffer、UniformBuffer 封装 - UniformBuffer:每帧上传 MVP 矩阵 - DescriptorManager:DescriptorSetLayout、DescriptorPool、DescriptorSet 及更新 Renderer: - 协调所有子系统 - 绘制每面不同颜色的旋转 3D 立方体 - 启用 depth test,MVP 矩阵由 GLM 计算 构建: - CMake 组织 Engine 静态库与 App 可执行文件 - glfw、glm、spdlog 通过 add_subdirectory 引入
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
add_executable(HelloVulkan main.cpp)
|
||||
|
||||
target_link_libraries(HelloVulkan PRIVATE Engine)
|
||||
|
||||
|
||||
###### 自动构建shader ######
|
||||
find_program(GLSLC glslc REQUIRED)
|
||||
|
||||
set(SHADER_SRC_DIR ${CMAKE_SOURCE_DIR}/shaders)
|
||||
set(SHADER_OUT_DIR ${CMAKE_BINARY_DIR}/bin/shaders)
|
||||
|
||||
# 定义一个 shader 编译目标:<name>(glsl_file stage)
|
||||
function(auto_compile_shader glsl_file stage)
|
||||
# string(REGEX REPLACE "\\.glsl$" "" base "${glsl_file}")
|
||||
set(spv ${SHADER_OUT_DIR}/${glsl_file}.spv)
|
||||
add_custom_command(
|
||||
OUTPUT ${spv}
|
||||
COMMAND ${GLSLC} -fshader-stage=${stage} -o ${spv} ${SHADER_SRC_DIR}/${glsl_file}
|
||||
DEPENDS ${SHADER_SRC_DIR}/${glsl_file}
|
||||
VERBATIM)
|
||||
set_source_files_properties(${spv} PROPERTIES GENERATED TRUE)
|
||||
target_sources(${PROJECT_NAME} PRIVATE ${spv})
|
||||
set_property(DIRECTORY APPEND PROPERTY HZ_SHADER_SPV_FILES ${spv})
|
||||
endfunction()
|
||||
|
||||
auto_compile_shader(simple_shader.vert vert)
|
||||
auto_compile_shader(simple_shader.frag frag)
|
||||
@@ -0,0 +1,26 @@
|
||||
//
|
||||
// Created by atdunbg on 2026/9/20.
|
||||
//
|
||||
|
||||
#include <Engine/Core/Window.h>
|
||||
#include <Engine/Renderer/Renderer.h>
|
||||
#include <Engine/Core/Log.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
try {
|
||||
Engine::Window window("HelloVulkan", 1280, 720);
|
||||
Engine::Renderer renderer(window);
|
||||
|
||||
while (!window.ShouldClose()) {
|
||||
window.PollEvents();
|
||||
renderer.Render();
|
||||
}
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
ENGINE_FATAL("Exception: {}", e.what());
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user