Skip to main content

GBuffer

Struct GBuffer 

Source
pub struct GBuffer {
    pub layout: GBufferLayout,
    pub viewport: Viewport,
    pub fbo_handle: u64,
    pub texture_states: Vec<TextureState>,
    pub depth_texture_state: TextureState,
    pub mrt_config: MrtConfig,
    pub debug_view: GBufferDebugView,
    pub stats: GBufferStats,
    pub is_bound: bool,
    pub generation: u32,
    pub is_created: bool,
    /* private fields */
}
Expand description

The main G-Buffer object that manages all attachment textures and the framebuffer. This struct owns the GPU resource handles (as opaque u64 IDs) and provides bind/unbind/resize/clear operations.

Fields§

§layout: GBufferLayout

The layout describing all attachments.

§viewport: Viewport

Current viewport dimensions.

§fbo_handle: u64

Framebuffer object handle.

§texture_states: Vec<TextureState>

Per-attachment texture states.

§depth_texture_state: TextureState

Depth texture state.

§mrt_config: MrtConfig

MRT configuration derived from the layout.

§debug_view: GBufferDebugView

Debug view state.

§stats: GBufferStats

Statistics.

§is_bound: bool

Whether the G-Buffer is currently bound as the render target.

§generation: u32

Generation counter (incremented on resize).

§is_created: bool

Whether the G-Buffer resources have been created.

Implementations§

Source§

impl GBuffer

Source

pub fn new(viewport: Viewport) -> Self

Create a new G-Buffer with the default layout.

Source

pub fn with_layout(layout: GBufferLayout, viewport: Viewport) -> Self

Create a new G-Buffer with a custom layout.

Source

pub fn create(&mut self) -> Result<(), GBufferError>

Allocate GPU resources for the G-Buffer. In a real engine this would call OpenGL/Vulkan; here we simulate handle allocation.

Source

pub fn destroy(&mut self)

Destroy GPU resources.

Source

pub fn bind(&mut self) -> Result<(), GBufferError>

Bind the G-Buffer as the current render target.

Source

pub fn unbind(&mut self)

Unbind the G-Buffer (restore default framebuffer).

Source

pub fn bind_for_reading(&self) -> Result<Vec<(u32, u64)>, GBufferError>

Bind all G-Buffer textures for reading in the lighting pass.

Source

pub fn bind_attachment( &self, semantic: GBufferSemantic, texture_unit: u32, ) -> Result<u64, GBufferError>

Bind a single attachment for sampling.

Source

pub fn resize(&mut self, width: u32, height: u32) -> Result<(), GBufferError>

Resize the G-Buffer to a new resolution. Recreates all textures.

Source

pub fn clear_all(&mut self)

Clear all G-Buffer attachments using their configured clear values.

Source

pub fn clear_attachment( &self, semantic: GBufferSemantic, ) -> Result<(), GBufferError>

Clear a specific attachment.

Source

pub fn texture_handle(&self, semantic: GBufferSemantic) -> Option<u64>

Get the texture handle for a specific attachment.

Source

pub fn viewport(&self) -> Viewport

Get the current viewport.

Source

pub fn aspect_ratio(&self) -> f32

Get the aspect ratio.

Source

pub fn stats(&self) -> &GBufferStats

Get a reference to the stats.

Source

pub fn describe(&self) -> String

Get a human-readable description of the G-Buffer configuration.

Source

pub fn needs_recreate(&self) -> bool

Check if the G-Buffer needs to be recreated (e.g., after layout change).

Source

pub fn fullscreen_quad_vertices() -> ([f32; 12], [f32; 8])

Convenience: create a fullscreen quad vertex data for the lighting pass. Returns (positions, uvs) for two triangles covering NDC [-1, 1].

Source

pub fn lighting_vertex_shader() -> &'static str

Generate the complete GLSL vertex shader for the fullscreen lighting quad.

Source

pub fn lighting_fragment_preamble(&self) -> String

Generate the lighting pass fragment shader preamble (sampler uniforms).

Trait Implementations§

Source§

impl Debug for GBuffer

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for GBuffer

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more

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<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> DowncastSync for T
where T: Any + Send + Sync,

Source§

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

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<S> FromSample<S> for S

Source§

fn from_sample_(s: S) -> S

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, U> ToSample<U> for T
where U: FromSample<T>,

Source§

fn to_sample_(self) -> U

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> 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
Source§

impl<S, T> Duplex<S> for T
where T: FromSample<S> + ToSample<S>,