Как я могу рендерить сцену gfx-rs (opengl) в окно ImGui-rs? - PullRequest
0 голосов
/ 23 декабря 2018

Я новичок в Rust & gfx-rs, я хочу рендерить текстуру и использовать эту текстуру в качестве изображения для imgui, через несколько часов :-) Я успешно создал текстуру, используя factory.view_texture_as_render_target, но яне знаю, как использовать его в качестве текстуры в imgui;(PS: я сделал это однажды, используя c ++ как https://gamedev.stackexchange.com/questions/140693/how-can-i-render-an-opengl-scene-into-an-imgui-window?rq=1)

На самом деле это то, что я хочу сделать, и я попробовал это, но это не работает.Кажется, текстуры не относятся к одному и тому же типу (или, может быть, я сделал это неправильно: я начинающий ржаветь), я был бы признателен, если бы взглянул на код ниже, может быть, вы можете дать мне другое предложение.PS: в с ++ он использует указатели.Но в ржавчине я не очень привык к системе печати. ​​

она основана на этом примере: https://github.com/WimbledonLabs/imgui_gfx_example спасибо

pub fn main() {
    let mut events_loop = glutin::EventsLoop::new();
    //window && glcontext
    let windowbuilder = glutin::WindowBuilder::new()
        .with_title("Triangle Example".to_string())
        .with_dimensions(LogicalSize::from((512, 512)));

    let contextbuilder = glutin::ContextBuilder::new()
        .with_gl(GlRequest::Specific(OpenGl, (3, 2)))
        .with_vsync(true);
    let (window, mut device, mut factory, mut color_view, mut depth_view) =
        gfx_glutin::init::<ColorFormat, DepthFormat>(
            windowbuilder,
            contextbuilder,
            &events_loop,
        );


    let sampler = factory.create_sampler_linear();
    let texture = gfx_load_texture(&mut factory);

    let (vertex_buffer, slice) =
        factory.create_vertex_buffer_with_slice(&TRIANGLE, ());
    let transform_buffer = factory.create_constant_buffer(1);






let viewer_size = (200, 200);
let (width, height) = viewer_size;

//let _depth = factory.create_depth_stencil_view_only(width as u16, height as u16).unwrap();

let levels = 1;
let kind = gfx::texture::Kind::D2(width as u16, height as u16, gfx::texture::AaMode::Single);
//providing the storage configuration and requesting the capabilities
let texture_buf = factory.create_texture::<gfx::format::R8_G8_B8_A8>(kind, levels,  gfx::memory::Bind::SHADER_RESOURCE |  gfx::memory::Bind::RENDER_TARGET,  gfx::memory::Usage::Data, None).unwrap();

// creating an RTV for level 0
let target_tex = factory.view_texture_as_render_target::<ColorFormat>(&texture_buf, 0, None).unwrap();      

// creating an SRV for the whole mipmap range
let mut resource_tex = factory.view_texture_as_shader_resource::<ColorFormat>(&texture_buf, (0, levels-1), gfx::format::Swizzle::new()).unwrap(); 






    let data = pipe::Data {
        vbuf: vertex_buffer,
        tex: (texture, sampler),
        transform: transform_buffer,
        //out: color_view.clone(),
        out: target_tex,
    };


let mut text_for_imgui = imgui::Textures::new();
let texture_for_imgui = text_for_imgui.insert(&texture_buf);
.
.
.
let ui = imgui.frame(frame_size, delta_s);
ui.image(texture_for_imgui , img_size);
.
.
.
...