diff --git a/example/src/main.cpp b/example/src/main.cpp index 17d8ccd..55550c7 100644 --- a/example/src/main.cpp +++ b/example/src/main.cpp @@ -9,10 +9,21 @@ #include "pixel.h" #include "misc/mapped_file/mapped_file.h" #include "stb_image_loader.h" +#include "render/render_image.h" int main(int argc, char* argv[]) { mirage_app::get().init(); + auto file = mapped_file::create(); + file->map_file(L"Z:/Root/Local/NanakoDisk/涩图/可爱偷猴计划/东风谷早苗/57092520_p1.jpg"); + + stb_image_loader image; + image.init(file->get_data(), file->get_size()); + const auto& heap = image.load(); + + render_image i; + i.create(heap->data, { heap->info.width, heap->info.height }, heap->info.get_pixel_format()); + const auto& window = mwindow::create({ 800, 600 }, L"Hello, World!"); window->set_content( std::make_shared() diff --git a/src/mirage_render/render/render_image.h b/src/mirage_render/render/render_image.h index ce235e6..f2e3881 100644 --- a/src/mirage_render/render/render_image.h +++ b/src/mirage_render/render/render_image.h @@ -4,16 +4,28 @@ #include "sokol_gfx.h" #include "pixel.h" +/** + * @class render_image + * @brief 渲染图像类 + * + * 用于静态图片的渲染,提供创建和清除操作。 + */ class render_image { public: - template - void create(image_accessor

in_accessor) { - + ~render_image() { + clear(); + } + void create(void* in_data, const Eigen::Vector2i& in_size, sg_pixel_format in_pixel_format); + void clear() { + if (clear_func_) { + clear_func_(); + } } - void create(void* in_data, const Eigen::Vector2i& in_size, sg_pixel_format in_pixel_format); - + [[nodiscard]] const auto& get_image() const { return image_; } + [[nodiscard]] const auto& get_size() const { return size_; } private: + std::function clear_func_{}; sg_image image_{}; Eigen::Vector2i size_{}; }; diff --git a/src/mirage_render/render/windows/render_image.cpp b/src/mirage_render/render/windows/render_image.cpp index a8011b7..3e9212f 100644 --- a/src/mirage_render/render/windows/render_image.cpp +++ b/src/mirage_render/render/windows/render_image.cpp @@ -1,5 +1,6 @@ #include "render/render_image.h" #include +#include #include "pixel_format_convert.h" #include "windows_render_context.h" @@ -25,9 +26,44 @@ void render_image::create(void* in_data, const Eigen::Vector2i& in_size, sg_pixe desc.CPUAccessFlags = 0; desc.MiscFlags = 0; + const auto& format_info = sg_query_pixelformat(in_pixel_format); + D3D11_SUBRESOURCE_DATA data = {}; - data.pSysMem = nullptr; - data.SysMemPitch = 0; + data.pSysMem = in_data; + data.SysMemPitch = in_size.x() * format_info.bytes_per_pixel; data.SysMemSlicePitch = 0; + // 创建纹理 + ID3D11Texture2D* texture = nullptr; + auto hr = windows_render_context->get_device()->CreateTexture2D(&desc, &data, &texture); + if (FAILED(hr)) { + std::cerr << "Failed to create texture" << std::endl; + return; + } + + // 创建SRV + D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc = {}; + srv_desc.Format = pixel_format; + srv_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srv_desc.Texture2D.MostDetailedMip = 0; + srv_desc.Texture2D.MipLevels = 1; + + ID3D11ShaderResourceView* srv = nullptr; + hr = windows_render_context->get_device()->CreateShaderResourceView(texture, &srv_desc, &srv); + if (FAILED(hr)) { + texture->Release(); + std::cerr << "Failed to create shader resource view" << std::endl; + return; + } + + clear_func_ = [=] { + texture->Release(); + srv->Release(); + }; + + sg_image_desc sg_desc{}; + sg_desc.d3d11_texture = texture; + sg_desc.d3d11_shader_resource_view = srv; + + image_ = sg_make_image(sg_desc); }