#[repr(C)]pub struct GpuObjectData {Show 19 fields
pub model: [[f32; 4]; 4],
pub tint: [f32; 3],
pub roughness: f32,
pub emissive: [f32; 3],
pub metallic: f32,
pub albedo_index: u32,
pub normal_index: u32,
pub macro_variation: f32,
pub terrain_blend: f32,
pub bb_min: [f32; 3],
pub cull_distance: f32,
pub bb_max: [f32; 3],
pub secondary_blend_sharpness: f32,
pub albedo_secondary_index: u32,
pub normal_secondary_index: u32,
pub emissive_map_index: u32,
pub orm_map_index: u32,
pub alpha_cutoff: f32,
pub _pad: [f32; 3],
}Expand description
Per-object record consumed by the Metal “bindless” static main pass.
The static pipeline no longer rebinds model/material/textures per draw
call: every object’s transform, material scalars, and texture-pool indices
live in one GPU buffer, and the vertex/fragment shaders index it by the
object id delivered through [[base_instance]]. That makes each draw call
stateless, which is the prerequisite for the GPU-driven compute-cull +
indirect-command-buffer pass.
The renderer rebuilds the buffer each frame from its DrawObject list, so
update_model / update_visibility changes are picked up automatically.
bb_min / bb_max / cull_distance mirror the DrawObject AABB and are
unused by the main-pass shaders; they are carried so a GPU-driven compute
cull kernel can read object bounds straight from this buffer without a
layout change.
Layout (176 bytes) must stay in sync with the shader-side record, declared
once per language in concinnity-device: vulkan/shaders/object_common.glsl,
directx/shaders/object_common.hlsl and metal/shaders/object_common.msl,
each spliced into its backend’s passes at an {OBJECT_DATA} marker, plus
shaders/object_common.slang for the single-source passes.
object_data_layout in concinnity-device pins the three hand-written
fragments to each other, and shader_layout there pins this struct against
slangc’s reflection of the fourth.
albedo_index / normal_index (and the secondary / emissive / ORM indices)
are indices into each backend’s single handle-indexed texture pool: albedo,
normal, and every optional map share one dense table, so a texture used in
more than one role resolves to one descriptor. The pool’s two fallbacks
occupy reserved slots past the real textures: an object with no normal map
addresses the flat-normal entry and one with no albedo addresses the white
entry, so neither index needs a shader branch.
Fields§
§model: [[f32; 4]; 4]Column-major model-to-world matrix.
tint: [f32; 3]Linear-space RGB multiplier on the albedo sample.
roughness: f32Perceptual roughness [0, 1].
emissive: [f32; 3]Additive emission colour in linear space.
metallic: f32Metallic factor [0, 1].
albedo_index: u32Index into the bindless texture pool for this object’s albedo map.
normal_index: u32Index into the bindless texture pool for this object’s normal map.
macro_variation: f32Macro-variation strength [0, 1]; 0 disables the tiling-break noise.
terrain_blend: f32Terrain-shading blend [0, 1]; 0 disables (default PBR sampling),
non-zero switches the shader to a triplanar world-space projection
with slope-based rocky-tint blending. See Material::terrain_blend.
bb_min: [f32; 3]World-space AABB minimum (compute-cull bounds input).
cull_distance: f32View-distance cutoff; 0 = no cutoff (compute-cull bounds input).
bb_max: [f32; 3]World-space AABB maximum (compute-cull bounds input).
secondary_blend_sharpness: f32Sharpness of the slope-based blend between primary and
albedo_secondary_index textures. 0 = wide soft gradient;
1 = nearly hard cliff edge. Mirrors
MaterialUniforms::secondary_blend_sharpness.
albedo_secondary_index: u32Bindless-pool index for the secondary albedo (slope-shaded).
0 when the material doesn’t declare a secondary texture; the
shader’s terrain_blend > 0 gate keeps it from being sampled
in that case.
normal_secondary_index: u32Bindless-pool index for the secondary normal map (slope-shaded).
emissive_map_index: u32Bindless-pool index for the emissive map (0 = none). Mirrors
MaterialUniforms::emissive_map_index.
orm_map_index: u32Bindless-pool index for the packed occlusion/roughness/metalness map
(0 = none). Mirrors MaterialUniforms::orm_map_index.
alpha_cutoff: f32Alpha-cutout threshold in [0, 1]; 0 disables the test. Mirrors
MaterialUniforms::alpha_cutoff.
_pad: [f32; 3]Rounds the record to a 16-byte multiple so an array of them keeps every
model matrix 16-byte aligned.
Trait Implementations§
Source§impl Clone for GpuObjectData
impl Clone for GpuObjectData
Source§fn clone(&self) -> GpuObjectData
fn clone(&self) -> GpuObjectData
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more