rust Bevy -渲染到wgpu::纹理

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

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

  1. let framebuffer = //get framebuffer from web_sys
  2. let texture: wgpu::Texture = unsafe {
  3. device.create_texture_from_hal::<wgpu_hal::gles::Api>(
  4. wgpu_hal::gles::Texture {
  5. inner: wgpu_hal::gles::TextureInner::ExternalFramebuffer {
  6. inner: framebuffer,
  7. ...

我的问题是,一旦我创建了这个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设置为相机可以渲染的目标。在这里创建相机,在这里应用纹理视图。

  1. /// set the texture view in camera
  2. ...
  3. let mut entity = commands.spawn(Camera3dBundle {
  4. camera_3d: Camera3d {
  5. clear_color, //split screen
  6. ..default()
  7. },
  8. camera: Camera {
  9. order,
  10. target: RenderTarget::TextureView(**texture_id),
  11. viewport: Some(xr_camera.viewport.clone()),
  12. ..default()
  13. },
  14. transform: pose.into(),
  15. ..default()
  16. });
  17. }
  18. /// updating the texture view
  19. pub fn update_manual_texture_views(
  20. gl_layer: NonSend<web_sys::XrWebGlLayer>,
  21. render_device: Res<RenderDevice>,
  22. texture_id: Res<bevy_utils::FramebufferTextureViewId>,
  23. mut manual_tex_view: ResMut<ManualTextureViews>,
  24. ) {
  25. let dest_texture = xr_utils::create_framebuffer_texture(
  26. render_device.wgpu_device(),
  27. &gl_layer,
  28. );
  29. let size =
  30. UVec2::new(gl_layer.framebuffer_width(), gl_layer.framebuffer_height());
  31. let descriptor = wgpu::TextureViewDescriptor::default();
  32. let view = dest_texture.create_view(&descriptor);
  33. manual_tex_view.insert(
  34. **texture_id,
  35. ManualTextureView::with_default_format(view.into(), size),
  36. );
  37. }
展开查看全部

相关问题