metal绘制

This commit is contained in:
Nana 2025-02-24 04:43:48 +08:00
parent 0d92c395dd
commit 266b124c5c
7 changed files with 24 additions and 15 deletions

View File

@ -2,6 +2,6 @@ project(mirage_example)
set(CMAKE_CXX_STANDARD 23)
set(SRC_FILES "")
retrieve_files(src SRC_FILES)
retrieve_files(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_FILES)
add_executable(${PROJECT_NAME} ${SRC_FILES})
target_link_libraries(${PROJECT_NAME} PRIVATE mirage_core)

View File

@ -6,6 +6,6 @@ int main(int argc, char* argv[]) {
init.size = {800, 600};
init.resizable = true;
init.centered = true;
init.api = mirage::renderer_api::opengl;
// init.api = mirage::renderer_api::opengl;
return run(init);
}

View File

@ -35,6 +35,7 @@ SHADER_EXTENSIONS = {
'dxil': 'dxil',
'dxbc': 'dxbc',
'metallib': 'metallib',
'metal': 'metal',
'wgsl': 'wgsl'
}
@ -44,7 +45,8 @@ TARGET_PROFILES = {
'spirv': ['-profile', 'spirv_1_6'],
'dxbc': ['-profile', 'sm_5_0'],
'dxil': ['-profile', 'sm_6_6'],
'metallib': ['-capability', 'metallib_3_1']
'metallib': ['-capability', 'metallib'],
'metal': ['-capability', 'metal'],
}
class ShaderEntry:
@ -419,7 +421,7 @@ def main():
parser = argparse.ArgumentParser(description="使用 slangc 编译着色器并生成 LLGL 渲染管线 C++ 头文件")
parser.add_argument("--shader-list", help="着色器列表文件路径")
parser.add_argument("--output-dir", help="输出目录")
parser.add_argument("--slangc", default="slangc", help="slangc 编译器路径")
parser.add_argument("--slangc", default="/Users/nanako/Documents/Slang/bin/slangc", help="slangc 编译器路径")
parser.add_argument("--debug", action="store_true", help="启用调试模式编译")
parser.add_argument("--opengl", action="store_true", help="编译 OpenGL 着色器")
parser.add_argument("--vulkan", action="store_true", help="编译 Vulkan 着色器")
@ -435,7 +437,8 @@ def main():
['spirv', args.vulkan],
['dxbc', args.d3d11],
['dxil', args.d3d12],
['Metal Library Bytecode assembly', args.metal],
['metallib', args.metal],
['metal', args.metal],
]
output_dir = Path(args.output_dir or "shaders")

View File

@ -163,6 +163,7 @@ namespace mirage {
vertex_buffer_descriptor.miscFlags = LLGL::MiscFlags::DynamicUsage;
vertex_buffer_descriptor.cpuAccessFlags = LLGL::CPUAccessFlags::Write;
vertex_buffer_descriptor.vertexAttribs = in_vertex_format.attributes;
vertex_buffer_descriptor.stride = sizeof(T);
auto vertex_buffer = std::make_shared<render_buffer>();
vertex_buffer->init(vertex_buffer_descriptor);

View File

@ -44,14 +44,19 @@ namespace mirage {
param_buffer->set(param);
LLGL::PipelineLayoutDescriptor pipeline_layout_desc;
// pipeline_layout_desc.bindings.emplace_back(
// LLGL::ResourceType::Buffer,
// LLGL::BindFlags::VertexBuffer,
// LLGL::StageFlags::VertexStage,
// 0
// );
pipeline_layout_desc.bindings.emplace_back(
LLGL::ResourceType::Buffer,
LLGL::BindFlags::ConstantBuffer,
LLGL::StageFlags::VertexStage,
0
LLGL::StageFlags::VertexStage | LLGL::StageFlags::FragmentStage,
1
);
pipeline = generated_pipelines::create_aorii_rect_pipeline(get_renderer(), swap_chain->GetRenderPass(),
pipeline_layout_desc);
pipeline = generated_pipelines::create_aorii_rect_pipeline(get_renderer(), swap_chain->GetRenderPass(), pipeline_layout_desc);
push_rectangle({0, 0}, {100, 100}, linear_color::white);
return true;
@ -75,16 +80,16 @@ namespace mirage {
command_buffer->Begin(); {
command_buffer->SetViewport(swap_chain->GetResolution());
command_buffer->SetVertexBuffer(vertex_buffer->get_raw());
command_buffer->SetIndexBuffer(index_buffer->get_raw());
command_buffer->SetVertexBuffer(vertex_buffer->get_raw());
command_buffer->BeginRenderPass(*swap_chain); {
command_buffer->Clear(LLGL::ClearFlags::Color, {0.1f, 0.1f, 0.2f, 1.0f});
command_buffer->SetPipelineState(*pipeline.pipeline_state);
command_buffer->SetResource(0, param_buffer->get_raw());
command_buffer->DrawIndexed(index_buffer->get_size() / sizeof(uint32_t), 0);
}
command_buffer->EndRenderPass();

View File

@ -79,4 +79,4 @@ namespace mirage {
return in_point.x() >= pos.x() && in_point.x() <= pos.x() + size.x() && in_point.y() >= pos.y() && in_point.y() <= pos.y() + size.y();
}
};
}
}

View File

@ -4,7 +4,7 @@ struct ParamBuffer
{
matrix transform;
};
ParameterBlock<ParamBuffer> param_buffer : register(b0);
ParameterBlock<ParamBuffer> param_buffer : register(b1);
struct PSInput {
float4 position : SV_POSITION; // 裁剪空间坐标