pub struct BlurPipeline {
pipeline: RenderPipeline,
bind_group_layout: BindGroupLayout,
sampler: Sampler,
uniform_buffers: [Buffer; 6],
bind_groups: [BindGroup; 6],
}Expand description
Drives the 6 blur passes (3 levels × H+V). One pipeline, six bind groups — each pass needs its own bind group because the source texture changes between passes.
Fields§
§pipeline: RenderPipeline§bind_group_layout: BindGroupLayout§sampler: Sampler§uniform_buffers: [Buffer; 6]One uniform buffer per pass — 6 in total. Cheap; uniform buffers are tiny and writing different sigmas to one buffer mid-frame would require either dynamic offsets or per-pass write_buffer calls with a barrier, neither worth the complexity here.
bind_groups: [BindGroup; 6]One bind group per pass, holding (uniforms[i], source texture, sampler). Recreated when textures rebind (resize).
Implementations§
Source§impl BlurPipeline
impl BlurPipeline
Sourcepub fn new(
device: &Device,
target_format: TextureFormat,
width: u32,
height: u32,
render_view: &TextureView,
blur1_view: &TextureView,
blur2_view: &TextureView,
blur3_view: &TextureView,
blur1_scratch_view: &TextureView,
blur2_scratch_view: &TextureView,
blur3_scratch_view: &TextureView,
) -> Self
pub fn new( device: &Device, target_format: TextureFormat, width: u32, height: u32, render_view: &TextureView, blur1_view: &TextureView, blur2_view: &TextureView, blur3_view: &TextureView, blur1_scratch_view: &TextureView, blur2_scratch_view: &TextureView, blur3_scratch_view: &TextureView, ) -> Self
Build the pipeline against target_format and wire bind groups
for the 6 blur passes. The pyramid is downsampled at each level
(Blur1 = ½ render, Blur2 = ¼, Blur3 = ⅛); per-level scratches
match their level’s resolution.
The pass order is fixed at construction:
- pass 0 (H, σ=σ1): src =
render_view, dst =b1_scratch - pass 1 (V, σ=σ1): src =
b1_scratch, dst =blur1_view - pass 2 (H, σ=σ2): src =
blur1_view, dst =b2_scratch - pass 3 (V, σ=σ2): src =
b2_scratch, dst =blur2_view - pass 4 (H, σ=σ3): src =
blur2_view, dst =b3_scratch - pass 5 (V, σ=σ3): src =
b3_scratch, dst =blur3_view
texel_size is set per-pass to 1 / source-resolution, so each
Gaussian tap walks one source-texel in UV space regardless of
which level we’re at.
fn make_bind_group( device: &Device, layout: &BindGroupLayout, uniforms: &Buffer, source: &TextureView, sampler: &Sampler, idx: usize, ) -> BindGroup
Sourcepub fn rebind(
&mut self,
device: &Device,
queue: &Queue,
width: u32,
height: u32,
render_view: &TextureView,
blur1_view: &TextureView,
blur2_view: &TextureView,
blur1_scratch_view: &TextureView,
blur2_scratch_view: &TextureView,
blur3_scratch_view: &TextureView,
)
pub fn rebind( &mut self, device: &Device, queue: &Queue, width: u32, height: u32, render_view: &TextureView, blur1_view: &TextureView, blur2_view: &TextureView, blur1_scratch_view: &TextureView, blur2_scratch_view: &TextureView, blur3_scratch_view: &TextureView, )
Recreate the bind groups + refresh per-pass uniform texel_size
after the underlying textures are invalidated (resize).
Sourcepub fn render(
&self,
encoder: &mut CommandEncoder,
blur1_view: &TextureView,
blur2_view: &TextureView,
blur3_view: &TextureView,
blur1_scratch_view: &TextureView,
blur2_scratch_view: &TextureView,
blur3_scratch_view: &TextureView,
)
pub fn render( &self, encoder: &mut CommandEncoder, blur1_view: &TextureView, blur2_view: &TextureView, blur3_view: &TextureView, blur1_scratch_view: &TextureView, blur2_scratch_view: &TextureView, blur3_scratch_view: &TextureView, )
Encode the 6 blur passes for this frame. Caller is responsible
for submit-ing the encoder; the pipeline assumes the input
render_texture already holds the current warp pass output.
Auto Trait Implementations§
impl Freeze for BlurPipeline
impl !RefUnwindSafe for BlurPipeline
impl Send for BlurPipeline
impl Sync for BlurPipeline
impl Unpin for BlurPipeline
impl !UnwindSafe for BlurPipeline
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more