Merge e2dbe752d6
into 877d278785
This commit is contained in:
commit
bf5f1f5a3a
@ -843,6 +843,58 @@ impl Image {
|
|||||||
Image::new(size, dimension, data, format, asset_usage)
|
Image::new(size, dimension, data, format, asset_usage)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a new zero-filled image with a given size, which can be rendered to.
|
||||||
|
/// Useful for mirrors, UI, or exporting images for example.
|
||||||
|
/// This is primarily for use as a render target for a [`Camera`].
|
||||||
|
/// See [`RenderTarget::Image`].
|
||||||
|
///
|
||||||
|
/// For Standard Dynamic Range (SDR) images you can use [`TextureFormat::Rgba8UnormSrgb`].
|
||||||
|
/// For High Dynamic Range (HDR) images you can use [`TextureFormat::Rgba16Float`].
|
||||||
|
///
|
||||||
|
/// The default [`TextureUsages`] are
|
||||||
|
/// [`TEXTURE_BINDING`](TextureUsages::TEXTURE_BINDING),
|
||||||
|
/// [`COPY_DST`](TextureUsages::COPY_DST),
|
||||||
|
/// [`RENDER_ATTACHMENT`](TextureUsages::RENDER_ATTACHMENT).
|
||||||
|
///
|
||||||
|
/// The default [`RenderAssetUsages`] is [`MAIN_WORLD | RENDER_WORLD`](RenderAssetUsages::default)
|
||||||
|
/// so that it is accessible from the CPU and GPU.
|
||||||
|
/// You can customize this by changing the [`asset_usage`](Image::asset_usage) field.
|
||||||
|
///
|
||||||
|
/// [`Camera`]: https://docs.rs/bevy/latest/bevy/render/camera/struct.Camera.html
|
||||||
|
/// [`RenderTarget::Image`]: https://docs.rs/bevy/latest/bevy/render/camera/enum.RenderTarget.html#variant.Image
|
||||||
|
pub fn new_target_texture(width: u32, height: u32, format: TextureFormat) -> Self {
|
||||||
|
let size = Extent3d {
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
// You need to set these texture usage flags in order to use the image as a render target
|
||||||
|
let usage = TextureUsages::TEXTURE_BINDING
|
||||||
|
| TextureUsages::COPY_DST
|
||||||
|
| TextureUsages::RENDER_ATTACHMENT;
|
||||||
|
// Fill with zeroes
|
||||||
|
let data = vec![0; format.pixel_size() * size.volume()];
|
||||||
|
|
||||||
|
Image {
|
||||||
|
data: Some(data),
|
||||||
|
data_order: TextureDataOrder::default(),
|
||||||
|
texture_descriptor: TextureDescriptor {
|
||||||
|
size,
|
||||||
|
format,
|
||||||
|
dimension: TextureDimension::D2,
|
||||||
|
label: None,
|
||||||
|
mip_level_count: 1,
|
||||||
|
sample_count: 1,
|
||||||
|
usage,
|
||||||
|
view_formats: &[],
|
||||||
|
},
|
||||||
|
sampler: ImageSampler::Default,
|
||||||
|
texture_view_descriptor: None,
|
||||||
|
asset_usage: RenderAssetUsages::default(),
|
||||||
|
copy_on_resize: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the width of a 2D image.
|
/// Returns the width of a 2D image.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn width(&self) -> u32 {
|
pub fn width(&self) -> u32 {
|
||||||
|
@ -4,11 +4,7 @@ use std::f32::consts::PI;
|
|||||||
|
|
||||||
use bevy::{
|
use bevy::{
|
||||||
prelude::*,
|
prelude::*,
|
||||||
render::{
|
render::{render_resource::TextureFormat, view::RenderLayers},
|
||||||
render_asset::RenderAssetUsages,
|
|
||||||
render_resource::{Extent3d, TextureDimension, TextureFormat, TextureUsages},
|
|
||||||
view::RenderLayers,
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
@ -33,23 +29,8 @@ fn setup(
|
|||||||
mut materials: ResMut<Assets<StandardMaterial>>,
|
mut materials: ResMut<Assets<StandardMaterial>>,
|
||||||
mut images: ResMut<Assets<Image>>,
|
mut images: ResMut<Assets<Image>>,
|
||||||
) {
|
) {
|
||||||
let size = Extent3d {
|
|
||||||
width: 512,
|
|
||||||
height: 512,
|
|
||||||
..default()
|
|
||||||
};
|
|
||||||
|
|
||||||
// This is the texture that will be rendered to.
|
// This is the texture that will be rendered to.
|
||||||
let mut image = Image::new_fill(
|
let image = Image::new_target_texture(512, 512, TextureFormat::bevy_default());
|
||||||
size,
|
|
||||||
TextureDimension::D2,
|
|
||||||
&[0, 0, 0, 0],
|
|
||||||
TextureFormat::Bgra8UnormSrgb,
|
|
||||||
RenderAssetUsages::default(),
|
|
||||||
);
|
|
||||||
// You need to set these texture usage flags in order to use the image as a render target
|
|
||||||
image.texture_descriptor.usage =
|
|
||||||
TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_DST | TextureUsages::RENDER_ATTACHMENT;
|
|
||||||
|
|
||||||
let image_handle = images.add(image);
|
let image_handle = images.add(image);
|
||||||
|
|
||||||
|
@ -19,16 +19,16 @@ use bevy::{
|
|||||||
prelude::*,
|
prelude::*,
|
||||||
render::{
|
render::{
|
||||||
camera::RenderTarget,
|
camera::RenderTarget,
|
||||||
render_asset::{RenderAssetUsages, RenderAssets},
|
render_asset::RenderAssets,
|
||||||
render_graph::{self, NodeRunError, RenderGraph, RenderGraphContext, RenderLabel},
|
render_graph::{self, NodeRunError, RenderGraph, RenderGraphContext, RenderLabel},
|
||||||
render_resource::{
|
render_resource::{
|
||||||
Buffer, BufferDescriptor, BufferUsages, CommandEncoderDescriptor, Extent3d, MapMode,
|
Buffer, BufferDescriptor, BufferUsages, CommandEncoderDescriptor, Extent3d, MapMode,
|
||||||
PollType, TexelCopyBufferInfo, TexelCopyBufferLayout, TextureDimension, TextureFormat,
|
PollType, TexelCopyBufferInfo, TexelCopyBufferLayout, TextureFormat, TextureUsages,
|
||||||
TextureUsages,
|
|
||||||
},
|
},
|
||||||
renderer::{RenderContext, RenderDevice, RenderQueue},
|
renderer::{RenderContext, RenderDevice, RenderQueue},
|
||||||
Extract, Render, RenderApp, RenderSystems,
|
Extract, Render, RenderApp, RenderSystems,
|
||||||
},
|
},
|
||||||
|
window::ExitCondition,
|
||||||
winit::WinitPlugin,
|
winit::WinitPlugin,
|
||||||
};
|
};
|
||||||
use crossbeam_channel::{Receiver, Sender};
|
use crossbeam_channel::{Receiver, Sender};
|
||||||
@ -92,7 +92,7 @@ fn main() {
|
|||||||
primary_window: None,
|
primary_window: None,
|
||||||
// Don’t automatically exit due to having no windows.
|
// Don’t automatically exit due to having no windows.
|
||||||
// Instead, the code in `update()` will explicitly produce an `AppExit` event.
|
// Instead, the code in `update()` will explicitly produce an `AppExit` event.
|
||||||
exit_condition: bevy::window::ExitCondition::DontExit,
|
exit_condition: ExitCondition::DontExit,
|
||||||
..default()
|
..default()
|
||||||
})
|
})
|
||||||
// WinitPlugin will panic in environments without a display server.
|
// WinitPlugin will panic in environments without a display server.
|
||||||
@ -247,25 +247,14 @@ fn setup_render_target(
|
|||||||
};
|
};
|
||||||
|
|
||||||
// This is the texture that will be rendered to.
|
// This is the texture that will be rendered to.
|
||||||
let mut render_target_image = Image::new_fill(
|
let mut render_target_image =
|
||||||
size,
|
Image::new_target_texture(size.width, size.height, TextureFormat::bevy_default());
|
||||||
TextureDimension::D2,
|
render_target_image.texture_descriptor.usage |= TextureUsages::COPY_SRC;
|
||||||
&[0; 4],
|
|
||||||
TextureFormat::bevy_default(),
|
|
||||||
RenderAssetUsages::default(),
|
|
||||||
);
|
|
||||||
render_target_image.texture_descriptor.usage |=
|
|
||||||
TextureUsages::COPY_SRC | TextureUsages::RENDER_ATTACHMENT | TextureUsages::TEXTURE_BINDING;
|
|
||||||
let render_target_image_handle = images.add(render_target_image);
|
let render_target_image_handle = images.add(render_target_image);
|
||||||
|
|
||||||
// This is the texture that will be copied to.
|
// This is the texture that will be copied to.
|
||||||
let cpu_image = Image::new_fill(
|
let cpu_image =
|
||||||
size,
|
Image::new_target_texture(size.width, size.height, TextureFormat::bevy_default());
|
||||||
TextureDimension::D2,
|
|
||||||
&[0; 4],
|
|
||||||
TextureFormat::bevy_default(),
|
|
||||||
RenderAssetUsages::default(),
|
|
||||||
);
|
|
||||||
let cpu_image_handle = images.add(cpu_image);
|
let cpu_image_handle = images.add(cpu_image);
|
||||||
|
|
||||||
commands.spawn(ImageCopier::new(
|
commands.spawn(ImageCopier::new(
|
||||||
|
@ -51,17 +51,8 @@ fn main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn setup(mut commands: Commands, mut images: ResMut<Assets<Image>>) {
|
fn setup(mut commands: Commands, mut images: ResMut<Assets<Image>>) {
|
||||||
let mut image = Image::new_fill(
|
let mut image = Image::new_target_texture(SIZE.0, SIZE.1, TextureFormat::R32Float);
|
||||||
Extent3d {
|
image.asset_usage = RenderAssetUsages::RENDER_WORLD;
|
||||||
width: SIZE.0,
|
|
||||||
height: SIZE.1,
|
|
||||||
depth_or_array_layers: 1,
|
|
||||||
},
|
|
||||||
TextureDimension::D2,
|
|
||||||
&[0, 0, 0, 255],
|
|
||||||
TextureFormat::R32Float,
|
|
||||||
RenderAssetUsages::RENDER_WORLD,
|
|
||||||
);
|
|
||||||
image.texture_descriptor.usage =
|
image.texture_descriptor.usage =
|
||||||
TextureUsages::COPY_DST | TextureUsages::STORAGE_BINDING | TextureUsages::TEXTURE_BINDING;
|
TextureUsages::COPY_DST | TextureUsages::STORAGE_BINDING | TextureUsages::TEXTURE_BINDING;
|
||||||
let image0 = images.add(image.clone());
|
let image0 = images.add(image.clone());
|
||||||
|
Loading…
Reference in New Issue
Block a user