refactor
This commit is contained in:
+4
-47
@@ -4,9 +4,11 @@
|
||||
//! Datenmenge). Geometrie kommt von [`crate::render::ui`] als fertige
|
||||
//! [`SpriteVertex`]-Liste + [`SpriteBatch`]es (ein Batch je Textur). Die
|
||||
//! Texturen (weißer Pixel, Font-Atlas, …) werden einmal beim Bau
|
||||
//! hochgeladen — wie beim Szenen-Pass: Decode (CPU) ≠ Upload (GPU).
|
||||
//! hochgeladen — wie beim Szenen-Pass: Decode (CPU) ≠ Upload (GPU), und über
|
||||
//! dieselbe `scene::upload_texture`, nur ohne Mipchain.
|
||||
|
||||
use crate::engine::tga::Image;
|
||||
use crate::render::scene::upload_texture;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Clone, Copy, bytemuck::Pod, bytemuck::Zeroable)]
|
||||
@@ -134,7 +136,7 @@ impl SpritePass {
|
||||
});
|
||||
let tex_layout = pipeline.get_bind_group_layout(1);
|
||||
let tex_binds = textures.iter()
|
||||
.map(|img| upload_texture(device, queue, &tex_layout, &sampler, img))
|
||||
.map(|img| upload_texture(device, queue, &tex_layout, &sampler, img, "sprite texture", false))
|
||||
.collect();
|
||||
|
||||
Self { pipeline, vbuf, uniform_bind, tex_binds, loaded: 0 }
|
||||
@@ -160,48 +162,3 @@ impl SpritePass {
|
||||
}
|
||||
}
|
||||
|
||||
/// Ein RGBA8-`Image` als GPU-Textur hochladen und die Bind-Group (Textur +
|
||||
/// Sampler, group 1) bauen.
|
||||
fn upload_texture(
|
||||
device: &wgpu::Device,
|
||||
queue: &wgpu::Queue,
|
||||
layout: &wgpu::BindGroupLayout,
|
||||
sampler: &wgpu::Sampler,
|
||||
img: &Image,
|
||||
) -> wgpu::BindGroup {
|
||||
let size = wgpu::Extent3d { width: img.width, height: img.height, depth_or_array_layers: 1 };
|
||||
let texture = device.create_texture(&wgpu::TextureDescriptor {
|
||||
label: Some("sprite texture"),
|
||||
size,
|
||||
mip_level_count: 1,
|
||||
sample_count: 1,
|
||||
dimension: wgpu::TextureDimension::D2,
|
||||
format: wgpu::TextureFormat::Rgba8Unorm,
|
||||
usage: wgpu::TextureUsages::TEXTURE_BINDING | wgpu::TextureUsages::COPY_DST,
|
||||
view_formats: &[],
|
||||
});
|
||||
queue.write_texture(
|
||||
wgpu::TexelCopyTextureInfo {
|
||||
texture: &texture,
|
||||
mip_level: 0,
|
||||
origin: wgpu::Origin3d::ZERO,
|
||||
aspect: wgpu::TextureAspect::All,
|
||||
},
|
||||
&img.rgba,
|
||||
wgpu::TexelCopyBufferLayout {
|
||||
offset: 0,
|
||||
bytes_per_row: Some(img.width * 4),
|
||||
rows_per_image: Some(img.height),
|
||||
},
|
||||
size,
|
||||
);
|
||||
let view = texture.create_view(&Default::default());
|
||||
device.create_bind_group(&wgpu::BindGroupDescriptor {
|
||||
label: Some("sprite texture"),
|
||||
layout,
|
||||
entries: &[
|
||||
wgpu::BindGroupEntry { binding: 0, resource: wgpu::BindingResource::TextureView(&view) },
|
||||
wgpu::BindGroupEntry { binding: 1, resource: wgpu::BindingResource::Sampler(sampler) },
|
||||
],
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user