图片类
This commit is contained in:
parent
ed6722c297
commit
2c5ea1e7e9
@ -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<mbutton>()
|
||||
|
@ -4,16 +4,28 @@
|
||||
#include "sokol_gfx.h"
|
||||
#include "pixel.h"
|
||||
|
||||
/**
|
||||
* @class render_image
|
||||
* @brief 渲染图像类
|
||||
*
|
||||
* 用于静态图片的渲染,提供创建和清除操作。
|
||||
*/
|
||||
class render_image {
|
||||
public:
|
||||
template<typename P>
|
||||
void create(image_accessor<P> 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<void()> clear_func_{};
|
||||
sg_image image_{};
|
||||
Eigen::Vector2i size_{};
|
||||
};
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "render/render_image.h"
|
||||
#include <dxgi1_6.h>
|
||||
#include <iostream>
|
||||
|
||||
#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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user