封装render_context

This commit is contained in:
2025-02-18 16:58:45 +08:00
parent 6a7ebf73a9
commit 45231d9953
17 changed files with 656 additions and 34 deletions

View File

@@ -1,17 +1,12 @@
#include "render_context.h"
#include "LLGL/Utils/VertexFormat.h"
#include "mirage.h"
namespace mirage {
render_context::~render_context() {
if (main_command_buffer) {
get_renderer()->Release(*main_command_buffer);
}
if (vertex_buffer) {
get_renderer()->Release(*vertex_buffer);
}
if (swap_chain) {
get_renderer()->Release(*swap_chain);
if (command_buffer) {
get_renderer()->Release(*command_buffer);
}
}
bool render_context::init(const swap_chain_descriptor& in_desc, const std::shared_ptr<LLGL::Surface>& in_surface) {
@@ -22,30 +17,30 @@ namespace mirage {
spdlog::error("无法创建交换链");
return false;
}
main_command_buffer = get_renderer()->CreateCommandBuffer(LLGL::CommandBufferFlags::ImmediateSubmit);
if (main_command_buffer == nullptr) {
command_buffer = get_renderer()->CreateCommandBuffer(LLGL::CommandBufferFlags::ImmediateSubmit);
if (command_buffer == nullptr) {
spdlog::error("无法创建命令缓冲区");
return false;
}
set_vsync(in_desc.vsync);
// LLGL::BufferDescriptor vertex_buffer_descriptor{};
// vertex_buffer = get_renderer()->CreateBuffer(vertex_buffer_descriptor);
create_vertex_buffer();
create_index_buffer();
return true;
}
render_context::update_status render_context::update(const duration_type& in_delta_time) {
if (!main_command_buffer || !swap_chain) {
if (!command_buffer || !swap_chain) {
return update_status::fail;
}
if (!swap_chain->IsPresentable()) {
return update_status::wait_for_present;
}
main_command_buffer->Begin();
command_buffer->Begin();
{
main_command_buffer->BeginRenderPass(*swap_chain);
main_command_buffer->Clear(LLGL::ClearFlags::Color, {0.1f, 0.1f, 0.2f, 1.0f});
main_command_buffer->EndRenderPass();
command_buffer->BeginRenderPass(*swap_chain);
command_buffer->Clear(LLGL::ClearFlags::Color, {0.1f, 0.1f, 0.2f, 1.0f});
command_buffer->EndRenderPass();
}
main_command_buffer->End();
command_buffer->End();
swap_chain->Present();
return update_status::success;
}
@@ -62,4 +57,29 @@ namespace mirage {
spdlog::info("垂直同步: {}", vsync);
}
}
void render_context::create_vertex_buffer() {
// 创建顶点格式布局
LLGL::VertexFormat vertexFormat;
// 添加顶点属性
vertexFormat.AppendAttribute({"position", LLGL::Format::RGB32Float}); // float3 position
vertexFormat.AppendAttribute({"texCoord0", LLGL::Format::RG32Float}); // float2 uv
vertexFormat.AppendAttribute({"color", LLGL::Format::RGBA32Float}); // float4 color
vertexFormat.AppendAttribute({"texCoord1", LLGL::Format::RGBA32Float}); // float4 param_a
vertexFormat.AppendAttribute({"texCoord2", LLGL::Format::RGBA32Float}); // float4 param_b
vertexFormat.AppendAttribute({"texCoord3", LLGL::Format::RGBA32Float}); // float4 param_c
LLGL::BufferDescriptor vertex_buffer_descriptor{};
vertex_buffer_descriptor.size = sizeof(vertex_t) * 512;
vertex_buffer_descriptor.bindFlags = LLGL::BindFlags::VertexBuffer;
vertex_buffer_descriptor.vertexAttribs = vertexFormat.attributes;
vertex_buffer.init(vertex_buffer_descriptor);
}
void render_context::create_index_buffer() {
LLGL::BufferDescriptor index_buffer_descriptor{};
index_buffer_descriptor.size = sizeof(triangle_index_t) * 512;
index_buffer_descriptor.bindFlags = LLGL::BindFlags::IndexBuffer;
index_buffer.init(index_buffer_descriptor);
}
} // namespace mirage