diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index eb20624..facb131 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -28,6 +28,8 @@ endif () # 添加编译shader的自定义命令 shader_compile_target(${CMAKE_CURRENT_SOURCE_DIR}/shaders) +# 添加依赖, 当编译aorii_core时, 会先编译aorii_compile_shaders +add_dependencies(${PROJECT_NAME} aorii_compile_shaders) # 如果需要编译example, 添加自定义命令用于拷贝shader文件 if (BUILD_EXAMPLE) diff --git a/src/core/renderer/device_selector.cpp b/src/core/renderer/device_selector.cpp index 5f2534d..85a4850 100644 --- a/src/core/renderer/device_selector.cpp +++ b/src/core/renderer/device_selector.cpp @@ -25,7 +25,7 @@ vk::PhysicalDevice device_selector::get_main_device() const { } // 如果没有显示设备,则使用计算设备 if (!compute_group.empty()) { - spdlog::warn("没有找到同时支持显示和计算的设备,将使用计算设备"); + spdlog::warn("没有找到同时支持显示和计算的设备,将使用计算设备: {}", compute_group[0].getProperties().deviceName.data()); return compute_group[0]; } return nullptr; @@ -42,7 +42,7 @@ vk::PhysicalDevice device_selector::get_main_compute_device() const { } // 如果没有计算设备,则使用显示设备 if (!display_group.empty()) { - spdlog::warn("没有找到计算设备,将使用显示设备"); + spdlog::warn("没有找到计算设备,将使用显示设备: {}", display_group[0].getProperties().deviceName.data()); return display_group[0]; } return nullptr; diff --git a/src/core/renderer/renderer.cpp b/src/core/renderer/renderer.cpp index 02658af..7b785ff 100644 --- a/src/core/renderer/renderer.cpp +++ b/src/core/renderer/renderer.cpp @@ -6,6 +6,7 @@ #define STB_IMAGE_IMPLEMENTATION #define STBI_FAILURE_USERMSG #include "aorii.h" +#include "renderer_shader.h" #include "renderer_text.h" #include "async/thread_pool.h" #include "window/window_manager.h" @@ -179,6 +180,17 @@ bool aorii_renderer::init() { if (!main_window->create_swap_chain(swapchain_info)) return false; + renderer_shader frag_shader; + frag_shader.load("resource/shaders/test.frag.spv", main_device); + if (!frag_shader.is_valid()) { + return false; + } + renderer_shader vert_shader; + vert_shader.load("resource/shaders/test.vert.spv", main_device); + if (!vert_shader.is_valid()) { + return false; + } + return true; } diff --git a/src/core/renderer/renderer_shader.cpp b/src/core/renderer/renderer_shader.cpp new file mode 100644 index 0000000..db999c9 --- /dev/null +++ b/src/core/renderer/renderer_shader.cpp @@ -0,0 +1,56 @@ +#include "renderer_shader.h" + +#include +#include + +#include "renderer.h" + +renderer_shader::~renderer_shader() { + destroy(); +} + +bool renderer_shader::load(const std::filesystem::path& in_file_path, vk::Device in_device) { + if (!in_device) + return false; + destroy(); + device = in_device; + file_path = in_file_path; + + // 读取着色器文件 + + std::ifstream file(in_file_path.c_str(), std::ios::binary | std::ios::ate); + if (!file.is_open()) { + spdlog::error("无法打开着色器文件: {}", in_file_path.generic_string()); + return false; + } + const auto file_size = file.tellg(); + std::vector buffer(file_size); + file.seekg(0); + file.read(reinterpret_cast(buffer.data()), file_size); + file.close(); + + auto result = create_shader_module(buffer); + if (!result) { + spdlog::error("创建着色器模块失败"); + return false; + } + spdlog::info("加载着色器: {}", in_file_path.generic_string()); + return true; +} + +void renderer_shader::destroy() { + if (shader_module) { + device.destroyShaderModule(shader_module); + shader_module = nullptr; + spdlog::info("销毁着色器: {}", file_path.generic_string()); + } +} + +bool renderer_shader::create_shader_module(const std::vector& in_code) { + vk::ShaderModuleCreateInfo create_info{}; + create_info.setCodeSize(in_code.size()); + create_info.setPCode(reinterpret_cast(in_code.data())); + + shader_module = device.createShaderModule(create_info); + return shader_module; +} diff --git a/src/core/renderer/renderer_shader.h b/src/core/renderer/renderer_shader.h new file mode 100644 index 0000000..98726b1 --- /dev/null +++ b/src/core/renderer/renderer_shader.h @@ -0,0 +1,29 @@ +#pragma once +#include +#include + +class renderer_shader { +public: + ~renderer_shader(); + + bool load(const std::filesystem::path& in_file_path, vk::Device in_device); + + [[nodiscard]] const auto& get_shader_module() const { + return shader_module; + } + + [[nodiscard]] const auto& get_device() const { + return device; + } + + [[nodiscard]] bool is_valid() const { + return shader_module; + } +private: + void destroy(); + bool create_shader_module(const std::vector& in_code); + + vk::ShaderModule shader_module; + vk::Device device; + std::filesystem::path file_path; +}; diff --git a/src/core/renderer/renderer_types.h b/src/core/renderer/renderer_types.h index 0732ce1..d2f7b07 100644 --- a/src/core/renderer/renderer_types.h +++ b/src/core/renderer/renderer_types.h @@ -10,8 +10,8 @@ struct device_handle { vk::Device* operator->() { return &device; } const vk::Device* operator->() const { return &device; } - explicit operator vk::PhysicalDevice() const { return physical_device; } - explicit operator vk::Device() const { return device; } + operator vk::PhysicalDevice() const { return physical_device; } + operator vk::Device() const { return device; } operator bool() const { return static_cast(device); } bool operator!() const { return !device; } diff --git a/src/core/shaders/aorii_util.slang b/src/core/shaders/aorii_util.slang index b9db35a..a4fc118 100644 --- a/src/core/shaders/aorii_util.slang +++ b/src/core/shaders/aorii_util.slang @@ -9,8 +9,5 @@ struct VSInput { // 将uv坐标系移动到[-1, -1] ~ [1, 1] float2 uv_to_ndc(float2 uv) { -#ifdef UV_FLIP - uv.y = 1.0 - uv.y; -#endif return uv * 2.0 - 1.0; } diff --git a/src/core/shaders/test.frag b/src/core/shaders/test.frag index 3814cb5..7c5b0e7 100644 --- a/src/core/shaders/test.frag +++ b/src/core/shaders/test.frag @@ -1,7 +1,7 @@ #version 450 -#extension GL_ARB_separate_shader_objects : enable layout(location = 0) in vec3 fragColor; + layout(location = 0) out vec4 outColor; void main() { diff --git a/src/core/shaders/test.vert b/src/core/shaders/test.vert index 789b7dc..f5b2f8d 100644 --- a/src/core/shaders/test.vert +++ b/src/core/shaders/test.vert @@ -1,9 +1,5 @@ #version 450 -#extension GL_ARB_separate_shader_objects : enable -out gl_PerVertex { - vec4 gl_Position; -}; layout(location = 0) out vec3 fragColor; vec2 positions[3] = vec2[]( @@ -11,6 +7,7 @@ vec2 positions[3] = vec2[]( vec2(0.5, 0.5), vec2(-0.5, 0.5) ); + vec3 colors[3] = vec3[]( vec3(1.0, 0.0, 0.0), vec3(0.0, 1.0, 0.0), @@ -20,4 +17,4 @@ vec3 colors[3] = vec3[]( void main() { gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); fragColor = colors[gl_VertexIndex]; -} \ No newline at end of file +} diff --git a/src/core/window/renderer_window.cpp b/src/core/window/renderer_window.cpp index b0a8487..ef520a2 100644 --- a/src/core/window/renderer_window.cpp +++ b/src/core/window/renderer_window.cpp @@ -19,7 +19,7 @@ renderer_window::renderer_window(const window_desc& in_desc) { window = glfwCreateWindow(in_desc.resolution.width, in_desc.resolution.height, in_desc.title.c_str(), in_desc.monitor, nullptr); glfwSetWindowUserPointer(window, this); if (!window) { - spdlog::error("Failed to create window"); + spdlog::error("创建 GLFW 窗口失败"); return; }