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, 27fn location(index: u32) -> vec2<i32> { 29 i32(index) % i32(gaussian_uniforms.count_root_ceil), 30 i32(index) / i32(gaussian_uniforms.count_root_ceil), 34#ifdef PLANAR_TEXTURE_F16 36fn get_position(index: u32) -> vec3<f32> { 37 let sample = textureLoad( 50#if SH_VEC4_PLANES == 1 69 ray_direction: vec3<f32>, 71 let s0 = get_sh_vec(index, 0); 73 let v0 = unpack2x16float(s0.x); 74 let v1 = unpack2x16float(s0.y); 75 let v2 = unpack2x16float(s0.z); 76 let v3 = unpack2x16float(s0.w); 78 let rds = ray_direction * ray_direction; 79 var color = vec3<f32>(0.5); 81 color += shc[ 0] * vec3<f32>( 87#if SH_COEFF_COUNT > 11 94 let s1 = get_sh_vec(index, 1); 95 let v4 = unpack2x16float(s1.x); 96 let v5 = unpack2x16float(s1.y); 97 let v6 = unpack2x16float(s1.z); 98 let v7 = unpack2x16float(s1.w); 112 color += shc[ 1] * r1 * ray_direction.y; 113 color += shc[ 2] * r2 * ray_direction.z; 114 color += shc[ 3] * r3 * ray_direction.x; 117#if SH_COEFF_COUNT > 26 124 let s2 = get_sh_vec(index, 2); 125 let v8 = unpack2x16float(s2.x); 126 let v9 = unpack2x16float(s2.y); 127 let v10 = unpack2x16float(s2.z); 128 let v11 = unpack2x16float(s2.w); 148 let s3 = get_sh_vec(index, 3); 149 let v12 = unpack2x16float(s3.x); 150 let v13 = unpack2x16float(s3.y); 151 let v14 = unpack2x16float(s3.z); 152 let v15 = unpack2x16float(s3.w); 160 color += shc[ 4] * r4 * ray_direction.x * ray_direction.y; 161 color += shc[ 5] * r5 * ray_direction.y * ray_direction.z; 162 color += shc[ 6] * r6 * (2.0 * rds.z - rds.x - rds.y); 163 color += shc[ 7] * r7 * ray_direction.x * ray_direction.z; 164 color += shc[ 8] * r8 * (rds.x - rds.y); 167#if SH_COEFF_COUNT > 47 174 let s4 = get_sh_vec(index, 4); 175 let v16 = unpack2x16float(s4.x); 176 let v17 = unpack2x16float(s4.y); 177 let v18 = unpack2x16float(s4.z); 178 let v19 = unpack2x16float(s4.w); 198 let s5 = get_sh_vec(index, 5); 199 let v20 = unpack2x16float(s5.x); 200 let v21 = unpack2x16float(s5.y); 201 let v22 = unpack2x16float(s5.z); 202 let v23 = unpack2x16float(s5.w); 222 color += shc[ 9] * r9 * ray_direction.y * (3.0 * rds.x - rds.y); 223 color += shc[10] * r10 * ray_direction.x * ray_direction.y * ray_direction.z; 224 color += shc[11] * r11 * ray_direction.y * (4.0 * rds.z - rds.x - rds.y); 225 color += shc[12] * r12 * ray_direction.z * (2.0 * rds.z - 3.0 * rds.x - 3.0 * rds.y); 226 color += shc[13] * r13 * ray_direction.x * (4.0 * rds.z - rds.x - rds.y); 227 color += shc[14] * r14 * ray_direction.z * (rds.x - rds.y); 228 color += shc[15] * r15 * ray_direction.x * (rds.x - 3.0 * rds.y); 231 return srgb_to_linear(color); 234fn get_spherical_harmonics(index: u32) -> array<f32, #{SH_COEFF_COUNT}> { 235 var coefficients: array<f32, #{SH_COEFF_COUNT}>; 237 for (var i = 0u; i < #{SH_VEC4_PLANES}u; i = i + 1u) { 238 let sample = get_sh_vec(index, i32(i)); 240 let v0 = unpack2x16float(sample.x); 241 let v1 = unpack2x16float(sample.y); 242 let v2 = unpack2x16float(sample.z); 243 let v3 = unpack2x16float(sample.w); 245 let base_index = i * 8u; 246 coefficients[base_index ] = v0.x; 247 coefficients[base_index + 1u] = v0.y; 249 coefficients[base_index + 2u] = v1.x; 250 coefficients[base_index + 3u] = v1.y; 252 coefficients[base_index + 4u] = v2.x; 253 coefficients[base_index + 5u] = v2.y; 255 coefficients[base_index + 6u] = v3.x; 256 coefficients[base_index + 7u] = v3.y; 264 ray_direction: vec3<f32>, 266 let sh = get_spherical_harmonics(index); 267 let color = spherical_harmonics_lookup(ray_direction, sh); 268 return srgb_to_linear(color); 272#ifdef PRECOMPUTE_COVARIANCE_3D 273 fn get_cov3d(index: u32) -> array<f32, 6> { 274 let sample = textureLoad( 275 covariance_3d_opacity, 280 let c0 = unpack2x16float(sample.x); 281 let c1 = unpack2x16float(sample.y); 282 let c2 = unpack2x16float(sample.z); 284 var cov3d: array<f32, 6>; 296 fn get_rotation(index: u32) -> vec4<f32> { 297 let sample = textureLoad( 298 rotation_scale_opacity, 303 let q0 = unpack2x16float(sample.x); 304 let q1 = unpack2x16float(sample.y); 312 fn get_scale(index: u32) -> vec3<f32> { 313 let sample = textureLoad( 314 rotation_scale_opacity, 319 let s0 = unpack2x16float(sample.z); 320 let s1 = unpack2x16float(sample.w); 329fn get_opacity(index: u32) -> f32 { 330#ifdef PRECOMPUTE_COVARIANCE_3D 331 let sample = textureLoad( 332 covariance_3d_opacity, 337 return unpack2x16float(sample.w).y; 339 let sample = textureLoad( 340 rotation_scale_opacity, 345 return unpack2x16float(sample.w).x; 349fn get_visibility(index: u32) -> f32 { 350 let sample = textureLoad( 361#ifdef PLANAR_TEXTURE_F32 362fn get_position(index: u32) -> vec3<f32> { 363 return position_visibility[index].xyz; 366fn get_spherical_harmonics(index: u32) -> array<f32, #{SH_COEFF_COUNT}> { 367 return spherical_harmonics[index]; 370fn get_rotation(index: u32) -> vec4<f32> { 371 return rotation[index]; 374fn get_scale(index: u32) -> vec3<f32> { 375 return scale_opacity[index].xyz; 378fn get_opacity(index: u32) -> f32 { 379 return scale_opacity[index].w; 382fn get_visibility(index: u32) -> f32 { 383 return position_visibility[index].w;