pub struct BlurCompositor { /* private fields */ }Expand description
Gaussian backdrop blur sobre la intermediate (la textura donde vello pinta
la UI). El compositor empuja dos render passes separables (horizontal +
vertical) restringidas por scissor al rect del nodo .backdrop_blur(sigma),
usando una textura scratch interna del mismo tamaño que la intermediate.
Pipeline: vs = triángulo grande full-screen (clip-space), fs = suma
ponderada de N samples a lo largo de direction, pesos Gauss exp(-i²/2σ²).
El bind group lleva la textura source + sampler bilinear + UBO con
(direction, pixel_size, sigma, radius). El scissor recorta el output al
rect del nodo; el resto del target queda intacto (LoadOp::Load).
Coste: una pasada por dirección por nodo blur, ~2*radius+1 taps por
pixel del rect. Para sigma=8 (radius=24), ~49 taps/pixel — barato si el
rect es pequeño (chrome), pesado si es full-screen. v1: sin cap dinámico,
se asume que el caller no abusa.
Limitaciones v1:
- Un scratch full-screen alocado por compositor; resize sigue al
Surface. radiuscap en 32 — sigmas > ~10 se ven menos suaves (clip de cola).- Bordes del rect: clamp-to-edge (sampler) → los pixeles fuera del rect que se muestrean en la cola del Gauss salen como espejo del borde. En un viewport razonable la diferencia es invisible; documentado.
Implementations§
Source§impl BlurCompositor
impl BlurCompositor
pub fn new(device: &Device) -> Self
Sourcepub fn blur(
&mut self,
device: &Device,
queue: &Queue,
encoder: &mut CommandEncoder,
target: &TextureView,
viewport: (u32, u32),
rect: (f32, f32, f32, f32),
sigma: f32,
)
pub fn blur( &mut self, device: &Device, queue: &Queue, encoder: &mut CommandEncoder, target: &TextureView, viewport: (u32, u32), rect: (f32, f32, f32, f32), sigma: f32, )
Aplica un blur Gaussiano sobre target en el rect dado (coords pixel
del viewport). Si el rect cae fuera del viewport, no hace nada. Usa
un scratch interno del mismo tamaño que el viewport — se aloca lazy y
se reusa entre frames; se recrea si el viewport cambió.
sigma controla el ancho del kernel. ~σ=4 da “frosted glass” suave,
σ=16 un blur fuerte. El radius efectivo se cap a [BLUR_MAX_RADIUS].
Auto Trait Implementations§
impl !RefUnwindSafe for BlurCompositor
impl !UnwindSafe for BlurCompositor
impl Freeze for BlurCompositor
impl Send for BlurCompositor
impl Sync for BlurCompositor
impl Unpin for BlurCompositor
impl UnsafeUnpin for BlurCompositor
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.