1#define_import_path bevy_gaussian_splatting::texture 3#ifdef PRECOMPUTE_COVARIANCE_3D 4#import bevy_gaussian_splatting::bindings::{ 11#import bevy_gaussian_splatting::bindings::{ 16 rotation_scale_opacity, 21#import bevy_gaussian_splatting::spherical_harmonics::{ 23 spherical_harmonics_lookup, 28fn location(index: u32) -> vec2<i32> { 30 i32(index) % i32(gaussian_uniforms.count_root_ceil), 31 i32(index) / i32(gaussian_uniforms.count_root_ceil), 36#ifdef PLANAR_TEXTURE_F16 38fn get_position(index: u32) -> vec3<f32> { 39 let sample = textureLoad( 52#if SH_VEC4_PLANES == 1 71 ray_direction: vec3<f32>, 73 let s0 = get_sh_vec(index, 0); 75 let v0 = unpack2x16float(s0.x); 76 let v1 = unpack2x16float(s0.y); 77 let v2 = unpack2x16float(s0.z); 78 let v3 = unpack2x16float(s0.w); 80 let rds = ray_direction * ray_direction; 81 var color = vec3<f32>(0.5); 83 color += shc[ 0] * vec3<f32>( 89#if SH_COEFF_COUNT > 11 96 let s1 = get_sh_vec(index, 1); 97 let v4 = unpack2x16float(s1.x); 98 let v5 = unpack2x16float(s1.y); 99 let v6 = unpack2x16float(s1.z); 100 let v7 = unpack2x16float(s1.w); 114 color += shc[ 1] * r1 * ray_direction.y; 115 color += shc[ 2] * r2 * ray_direction.z; 116 color += shc[ 3] * r3 * ray_direction.x; 119#if SH_COEFF_COUNT > 26 126 let s2 = get_sh_vec(index, 2); 127 let v8 = unpack2x16float(s2.x); 128 let v9 = unpack2x16float(s2.y); 129 let v10 = unpack2x16float(s2.z); 130 let v11 = unpack2x16float(s2.w); 150 let s3 = get_sh_vec(index, 3); 151 let v12 = unpack2x16float(s3.x); 152 let v13 = unpack2x16float(s3.y); 153 let v14 = unpack2x16float(s3.z); 154 let v15 = unpack2x16float(s3.w); 162 color += shc[ 4] * r4 * ray_direction.x * ray_direction.y; 163 color += shc[ 5] * r5 * ray_direction.y * ray_direction.z; 164 color += shc[ 6] * r6 * (2.0 * rds.z - rds.x - rds.y); 165 color += shc[ 7] * r7 * ray_direction.x * ray_direction.z; 166 color += shc[ 8] * r8 * (rds.x - rds.y); 169#if SH_COEFF_COUNT > 47 176 let s4 = get_sh_vec(index, 4); 177 let v16 = unpack2x16float(s4.x); 178 let v17 = unpack2x16float(s4.y); 179 let v18 = unpack2x16float(s4.z); 180 let v19 = unpack2x16float(s4.w); 200 let s5 = get_sh_vec(index, 5); 201 let v20 = unpack2x16float(s5.x); 202 let v21 = unpack2x16float(s5.y); 203 let v22 = unpack2x16float(s5.z); 204 let v23 = unpack2x16float(s5.w); 224 color += shc[ 9] * r9 * ray_direction.y * (3.0 * rds.x - rds.y); 225 color += shc[10] * r10 * ray_direction.x * ray_direction.y * ray_direction.z; 226 color += shc[11] * r11 * ray_direction.y * (4.0 * rds.z - rds.x - rds.y); 227 color += shc[12] * r12 * ray_direction.z * (2.0 * rds.z - 3.0 * rds.x - 3.0 * rds.y); 228 color += shc[13] * r13 * ray_direction.x * (4.0 * rds.z - rds.x - rds.y); 229 color += shc[14] * r14 * ray_direction.z * (rds.x - rds.y); 230 color += shc[15] * r15 * ray_direction.x * (rds.x - 3.0 * rds.y); 233 return srgb_to_linear(color); 236fn get_spherical_harmonics(index: u32) -> array<f32, #{SH_COEFF_COUNT}> { 237 var coefficients: array<f32, #{SH_COEFF_COUNT}>; 239 for (var i = 0u; i < #{SH_VEC4_PLANES}u; i = i + 1u) { 240 let sample = get_sh_vec(index, i32(i)); 242 let v0 = unpack2x16float(sample.x); 243 let v1 = unpack2x16float(sample.y); 244 let v2 = unpack2x16float(sample.z); 245 let v3 = unpack2x16float(sample.w); 247 let base_index = i * 8u; 248 coefficients[base_index ] = v0.x; 249 coefficients[base_index + 1u] = v0.y; 251 coefficients[base_index + 2u] = v1.x; 252 coefficients[base_index + 3u] = v1.y; 254 coefficients[base_index + 4u] = v2.x; 255 coefficients[base_index + 5u] = v2.y; 257 coefficients[base_index + 6u] = v3.x; 258 coefficients[base_index + 7u] = v3.y; 266 ray_direction: vec3<f32>, 268 let sh = get_spherical_harmonics(index); 269 let color = spherical_harmonics_lookup(ray_direction, sh); 270 return srgb_to_linear(color); 275#ifdef PRECOMPUTE_COVARIANCE_3D 276 fn get_cov3d(index: u32) -> array<f32, 6> { 277 let sample = textureLoad( 278 covariance_3d_opacity, 283 let c0 = unpack2x16float(sample.x); 284 let c1 = unpack2x16float(sample.y); 285 let c2 = unpack2x16float(sample.z); 287 var cov3d: array<f32, 6>; 299 fn get_rotation(index: u32) -> vec4<f32> { 300 let sample = textureLoad( 301 rotation_scale_opacity, 306 let q0 = unpack2x16float(sample.x); 307 let q1 = unpack2x16float(sample.y); 315 fn get_scale(index: u32) -> vec3<f32> { 316 let sample = textureLoad( 317 rotation_scale_opacity, 322 let s0 = unpack2x16float(sample.z); 323 let s1 = unpack2x16float(sample.w); 332fn get_opacity(index: u32) -> f32 { 333#ifdef PRECOMPUTE_COVARIANCE_3D 334 let sample = textureLoad( 335 covariance_3d_opacity, 340 return unpack2x16float(sample.w).y; 342 let sample = textureLoad( 343 rotation_scale_opacity, 348 return unpack2x16float(sample.w).x; 352fn get_visibility(index: u32) -> f32 { 353 let sample = textureLoad( 365#ifdef PLANAR_TEXTURE_F32 366fn get_position(index: u32) -> vec3<f32> { 367 return position_visibility[index].xyz; 370fn get_spherical_harmonics(index: u32) -> array<f32, #{SH_COEFF_COUNT}> { 371 return spherical_harmonics[index]; 374fn get_rotation(index: u32) -> vec4<f32> { 375 return rotation[index]; 378fn get_scale(index: u32) -> vec3<f32> { 379 return scale_opacity[index].xyz; 382fn get_opacity(index: u32) -> f32 { 383 return scale_opacity[index].w; 386fn get_visibility(index: u32) -> f32 { 387 return position_visibility[index].w;