rust Bevy -渲染到wgpu::纹理

dsekswqp  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(148)

我正在寻找一个优雅的,希望bevy风格的渲染到wgpu::Texture的方式。原因是我正在实现一个WebXR库,而WebXRFramebuffer必须在沉浸式XR中呈现。

let framebuffer = //get framebuffer from web_sys
let texture: wgpu::Texture = unsafe {
        device.create_texture_from_hal::<wgpu_hal::gles::Api>(
            wgpu_hal::gles::Texture {
                inner: wgpu_hal::gles::TextureInner::ExternalFramebuffer {
                    inner: framebuffer,
...

我的问题是,一旦我创建了这个wgpu::Texture,是否有一种方法可以:
1.将其设置为bevy引擎的主要通道纹理
1.将摄像机渲染到bevy::Image并将其blit到wgpu::texture
我已经看到像超导体引擎这样的例子做了很多低级别的wgpu工作来实现这一点,但感觉应该有一个更简单的方法来实现最近的bevy功能,如渲染图和相机渲染目标。

xwbd5t1u

xwbd5t1u1#

从Bevy 0.11开始支持渲染到TextureView,有关更多信息,请参阅pr
下面是我的web_xr crate的一个expert,它将gl_layer中的TextureView设置为相机可以渲染的目标。在这里创建相机,在这里应用纹理视图。

/// set the texture view in camera
...
let mut entity = commands.spawn(Camera3dBundle {
            camera_3d: Camera3d {
                clear_color, //split screen
                ..default()
            },
            camera: Camera {
                order,
                target: RenderTarget::TextureView(**texture_id),
                viewport: Some(xr_camera.viewport.clone()),
                ..default()
            },
            transform: pose.into(),
            ..default()
        });
}

/// updating the texture view
pub fn update_manual_texture_views(
    gl_layer: NonSend<web_sys::XrWebGlLayer>,
    render_device: Res<RenderDevice>,
    texture_id: Res<bevy_utils::FramebufferTextureViewId>,
    mut manual_tex_view: ResMut<ManualTextureViews>,
) {
    let dest_texture = xr_utils::create_framebuffer_texture(
        render_device.wgpu_device(),
        &gl_layer,
    );

    let size =
        UVec2::new(gl_layer.framebuffer_width(), gl_layer.framebuffer_height());

    let descriptor = wgpu::TextureViewDescriptor::default();
    let view = dest_texture.create_view(&descriptor);

    manual_tex_view.insert(
        **texture_id,
        ManualTextureView::with_default_format(view.into(), size),
    );
}

相关问题