Skip to main content

BlurCompositor

Struct BlurCompositor 

Source
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.
  • radius cap 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

Source

pub fn new(device: &Device) -> Self

Source

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§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert 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>

Convert 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)

Convert &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)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more