diff options
Diffstat (limited to 'assets')
| -rw-r--r-- | assets/final/demo_assets.txt | 5 | ||||
| -rw-r--r-- | assets/final/dodecahedron.obj | 61 | ||||
| -rw-r--r-- | assets/final/shaders/mesh_render.wgsl | 58 | ||||
| -rw-r--r-- | assets/final/shaders/render/scene_query.wgsl | 61 | ||||
| -rw-r--r-- | assets/final/shaders/render/scene_query_bvh.wgsl | 13 | ||||
| -rw-r--r-- | assets/final/shaders/render/scene_query_linear.wgsl | 60 | ||||
| -rw-r--r-- | assets/final/shaders/renderer_3d.wgsl | 67 | ||||
| -rw-r--r-- | assets/final/test_assets_list.txt | 14 | ||||
| -rw-r--r-- | assets/final/test_mesh.obj | 30 |
9 files changed, 280 insertions, 89 deletions
diff --git a/assets/final/demo_assets.txt b/assets/final/demo_assets.txt index c38da51..d5ce9b4 100644 --- a/assets/final/demo_assets.txt +++ b/assets/final/demo_assets.txt @@ -46,4 +46,7 @@ SHADER_MATH_SDF_UTILS, NONE, shaders/math/sdf_utils.wgsl, "SDF Utils Snippet" SHADER_RENDER_SHADOWS, NONE, shaders/render/shadows.wgsl, "Shadows Snippet" SHADER_RENDER_SCENE_QUERY_BVH, NONE, shaders/render/scene_query_bvh.wgsl, "Scene Query Snippet (BVH)" SHADER_RENDER_SCENE_QUERY_LINEAR, NONE, shaders/render/scene_query_linear.wgsl, "Scene Query Snippet (Linear)" -SHADER_RENDER_LIGHTING_UTILS, NONE, shaders/render/lighting_utils.wgsl, "Lighting Utils Snippet"
\ No newline at end of file +SHADER_RENDER_LIGHTING_UTILS, NONE, shaders/render/lighting_utils.wgsl, "Lighting Utils Snippet" +SHADER_MESH, NONE, shaders/mesh_render.wgsl, "Mesh Rasterization Shader" +MESH_CUBE, NONE, test_mesh.obj, "A simple cube mesh" +DODECAHEDRON, NONE, dodecahedron.obj, "A dodecahedron mesh"
\ No newline at end of file diff --git a/assets/final/dodecahedron.obj b/assets/final/dodecahedron.obj new file mode 100644 index 0000000..c3d6c09 --- /dev/null +++ b/assets/final/dodecahedron.obj @@ -0,0 +1,61 @@ +# OBJ file created by ply_to_obj.c +# +g Object001 + +v -0.57735 -0.57735 0.57735 +v 0.934172 0.356822 0 +v 0.934172 -0.356822 0 +v -0.934172 0.356822 0 +v -0.934172 -0.356822 0 +v 0 0.934172 0.356822 +v 0 0.934172 -0.356822 +v 0.356822 0 -0.934172 +v -0.356822 0 -0.934172 +v 0 -0.934172 -0.356822 +v 0 -0.934172 0.356822 +v 0.356822 0 0.934172 +v -0.356822 0 0.934172 +v 0.57735 0.57735 -0.57735 +v 0.57735 0.57735 0.57735 +v -0.57735 0.57735 -0.57735 +v -0.57735 0.57735 0.57735 +v 0.57735 -0.57735 -0.57735 +v 0.57735 -0.57735 0.57735 +v -0.57735 -0.57735 -0.57735 + +f 19 3 2 +f 12 19 2 +f 15 12 2 +f 8 14 2 +f 18 8 2 +f 3 18 2 +f 20 5 4 +f 9 20 4 +f 16 9 4 +f 13 17 4 +f 1 13 4 +f 5 1 4 +f 7 16 4 +f 6 7 4 +f 17 6 4 +f 6 15 2 +f 7 6 2 +f 14 7 2 +f 10 18 3 +f 11 10 3 +f 19 11 3 +f 11 1 5 +f 10 11 5 +f 20 10 5 +f 20 9 8 +f 10 20 8 +f 18 10 8 +f 9 16 7 +f 8 9 7 +f 14 8 7 +f 12 15 6 +f 13 12 6 +f 17 13 6 +f 13 1 11 +f 12 13 11 +f 19 12 11 diff --git a/assets/final/shaders/mesh_render.wgsl b/assets/final/shaders/mesh_render.wgsl new file mode 100644 index 0000000..3faf7ca --- /dev/null +++ b/assets/final/shaders/mesh_render.wgsl @@ -0,0 +1,58 @@ +#include "common_uniforms" + +@group(0) @binding(0) var<uniform> globals: GlobalUniforms; +@group(0) @binding(1) var<storage, read> object_data: ObjectsBuffer; + +// Binding 2 is reserved for BVH (not used here but matches layout for simplicity) + +@group(0) @binding(3) var noise_tex: texture_2d<f32>; +@group(0) @binding(4) var noise_sampler: sampler; +@group(0) @binding(5) var sky_tex: texture_2d<f32>; + +struct VertexInput { + @location(0) position: vec3<f32>, + @location(1) normal: vec3<f32>, + @location(2) uv: vec2<f32>, +}; + +struct VertexOutput { + @builtin(position) clip_pos: vec4<f32>, + @location(0) world_pos: vec3<f32>, + @location(1) normal: vec3<f32>, + @location(2) uv: vec2<f32>, + @location(3) color: vec4<f32>, + @location(4) @interpolate(flat) instance_index: u32, +}; + +@vertex +fn vs_main(in: VertexInput, @builtin(instance_index) instance_index: u32) -> VertexOutput { + let obj = object_data.objects[instance_index]; + let world_pos = obj.model * vec4<f32>(in.position, 1.0); + + var out: VertexOutput; + out.clip_pos = globals.view_proj * world_pos; + out.world_pos = world_pos.xyz; + + // Use transpose of inverse for normals + let normal_matrix = mat3x3<f32>(obj.inv_model[0].xyz, obj.inv_model[1].xyz, obj.inv_model[2].xyz); + out.normal = normalize(transpose(normal_matrix) * in.normal); + + out.uv = in.uv; + out.color = obj.color; + out.instance_index = instance_index; + return out; +} + +#include "render/scene_query_mode" +#include "render/shadows" +#include "render/lighting_utils" + +@fragment +fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { + let light_dir = normalize(vec3<f32>(1.0, 1.0, 1.0)); + + let shadow = calc_shadow(in.world_pos, light_dir, 0.05, 20.0, in.instance_index); + let lit_color = calculate_lighting(in.color.rgb, in.normal, in.world_pos, shadow); + + return vec4<f32>(lit_color, in.color.a); +}
\ No newline at end of file diff --git a/assets/final/shaders/render/scene_query.wgsl b/assets/final/shaders/render/scene_query.wgsl deleted file mode 100644 index e44b79c..0000000 --- a/assets/final/shaders/render/scene_query.wgsl +++ /dev/null @@ -1,61 +0,0 @@ -#include "math/sdf_shapes" -#include "math/sdf_utils" // For aabb_sdf helper - -fn get_dist(p: vec3<f32>, obj_type: f32) -> f32 { - if (obj_type == 1.0) { return length(p) - 1.0; } // Unit Sphere - if (obj_type == 2.0) { return sdBox(p, vec3<f32>(1.0)); } // Unit Box - if (obj_type == 3.0) { return sdTorus(p, vec2<f32>(1.0, 0.4)); } // Unit Torus - if (obj_type == 4.0) { return sdPlane(p, vec3<f32>(0.0, 1.0, 0.0), 0.0); } - return 100.0; -} - -fn map_scene(p: vec3<f32>, skip_idx: u32) -> f32 { - var d = 1000.0; - let use_bvh = (globals.params.y > 0.5); - - if (use_bvh) { - var stack: array<i32, 32>; - var stack_ptr = 0; - - if (arrayLength(&bvh_nodes) > 0u) { - stack[stack_ptr] = 0; - stack_ptr++; - } - - while (stack_ptr > 0) { - stack_ptr--; - let node_idx = stack[stack_ptr]; - let node = bvh_nodes[node_idx]; - - if (aabb_sdf(p, node.min, node.max) < d) { - if (node.left_idx < 0) { // Leaf - let obj_idx = u32(node.obj_idx_or_right); - if (obj_idx == skip_idx) { continue; } - let obj = object_data.objects[obj_idx]; - let q = (obj.inv_model * vec4<f32>(p, 1.0)).xyz; - let s = min(length(obj.model[0].xyz), min(length(obj.model[1].xyz), length(obj.model[2].xyz))); - d = min(d, get_dist(q, obj.params.x) * s); - } else { // Internal - if (stack_ptr < 31) { - stack[stack_ptr] = node.left_idx; - stack_ptr++; - stack[stack_ptr] = node.obj_idx_or_right; - stack_ptr++; - } - } - } - } - } else { // Fallback to linear scan - let count = u32(globals.params.x); - for (var i = 0u; i < count; i = i + 1u) { - if (i == skip_idx) { continue; } - let obj = object_data.objects[i]; - if (obj.params.x <= 0.0) { continue; } // Skip raster objects - let q = (obj.inv_model * vec4<f32>(p, 1.0)).xyz; - let s = min(length(obj.model[0].xyz), min(length(obj.model[1].xyz), length(obj.model[2].xyz))); - d = min(d, get_dist(q, obj.params.x) * s); - } - } - - return d; -} diff --git a/assets/final/shaders/render/scene_query_bvh.wgsl b/assets/final/shaders/render/scene_query_bvh.wgsl index c7dfdf4..d040c1b 100644 --- a/assets/final/shaders/render/scene_query_bvh.wgsl +++ b/assets/final/shaders/render/scene_query_bvh.wgsl @@ -10,11 +10,13 @@ struct BVHNode { @group(0) @binding(2) var<storage, read> bvh_nodes: array<BVHNode>; -fn get_dist(p: vec3<f32>, obj_type: f32) -> f32 { +fn get_dist(p: vec3<f32>, obj_params: vec4<f32>) -> f32 { + let obj_type = obj_params.x; if (obj_type == 1.0) { return length(p) - 1.0; } // Unit Sphere if (obj_type == 2.0) { return sdBox(p, vec3<f32>(1.0)); } // Unit Box if (obj_type == 3.0) { return sdTorus(p, vec2<f32>(1.0, 0.4)); } // Unit Torus if (obj_type == 4.0) { return sdPlane(p, vec3<f32>(0.0, 1.0, 0.0), 0.0); } + if (obj_type == 5.0) { return sdBox(p, obj_params.yzw); } // MESH AABB return 100.0; } @@ -40,7 +42,14 @@ fn map_scene(p: vec3<f32>, skip_idx: u32) -> f32 { let obj = object_data.objects[obj_idx]; let q = (obj.inv_model * vec4<f32>(p, 1.0)).xyz; let s = min(length(obj.model[0].xyz), min(length(obj.model[1].xyz), length(obj.model[2].xyz))); - d = min(d, get_dist(q, obj.params.x) * s); + // IMPORTANT: Plane (type 4.0) should not be scaled by 's' in this way. + // The sdPlane function expects its own scale/offset implicitly handled by the model matrix. + // The 's' factor is meant for primitives whose SDFs are defined relative to a unit size. + if (obj.params.x != 4.0) { // Only scale if not a plane + d = min(d, get_dist(q, obj.params) * s); + } else { + d = min(d, get_dist(q, obj.params)); + } } else { // Internal if (stack_ptr < 31) { stack[stack_ptr] = node.left_idx; diff --git a/assets/final/shaders/render/scene_query_linear.wgsl b/assets/final/shaders/render/scene_query_linear.wgsl index 7bcd96f..30a0371 100644 --- a/assets/final/shaders/render/scene_query_linear.wgsl +++ b/assets/final/shaders/render/scene_query_linear.wgsl @@ -1,26 +1,64 @@ #include "math/sdf_shapes" +#include "math/sdf_utils" -fn get_dist(p: vec3<f32>, obj_type: f32) -> f32 { +struct BVHNode { + min: vec3<f32>, + left_idx: i32, + max: vec3<f32>, + obj_idx_or_right: i32, +}; + +@group(0) @binding(2) var<storage, read> bvh_nodes: array<BVHNode>; + +fn get_dist(p: vec3<f32>, obj_params: vec4<f32>) -> f32 { + let obj_type = obj_params.x; if (obj_type == 1.0) { return length(p) - 1.0; } // Unit Sphere if (obj_type == 2.0) { return sdBox(p, vec3<f32>(1.0)); } // Unit Box if (obj_type == 3.0) { return sdTorus(p, vec2<f32>(1.0, 0.4)); } // Unit Torus if (obj_type == 4.0) { return sdPlane(p, vec3<f32>(0.0, 1.0, 0.0), 0.0); } + if (obj_type == 5.0) { return sdBox(p, obj_params.yzw); } // MESH AABB return 100.0; } fn map_scene(p: vec3<f32>, skip_idx: u32) -> f32 { var d = 1000.0; - let count = u32(globals.params.x); + var stack: array<i32, 32>; + var stack_ptr = 0; - for (var i = 0u; i < count; i = i + 1u) { - if (i == skip_idx) { continue; } - let obj = object_data.objects[i]; - let obj_type = obj.params.x; - if (obj_type <= 0.0) { continue; } + if (arrayLength(&bvh_nodes) > 0u) { + stack[stack_ptr] = 0; + stack_ptr++; + } - let q = (obj.inv_model * vec4<f32>(p, 1.0)).xyz; - let s = min(length(obj.model[0].xyz), min(length(obj.model[1].xyz), length(obj.model[2].xyz))); - d = min(d, get_dist(q, obj_type) * s); + while (stack_ptr > 0) { + stack_ptr--; + let node_idx = stack[stack_ptr]; + let node = bvh_nodes[node_idx]; + + if (aabb_sdf(p, node.min, node.max) < d) { + if (node.left_idx < 0) { // Leaf + let obj_idx = u32(node.obj_idx_or_right); + if (obj_idx == skip_idx) { continue; } + let obj = object_data.objects[obj_idx]; + let q = (obj.inv_model * vec4<f32>(p, 1.0)).xyz; + let s = min(length(obj.model[0].xyz), min(length(obj.model[1].xyz), length(obj.model[2].xyz))); + // IMPORTANT: Plane (type 4.0) should not be scaled by 's' in this way. + // The sdPlane function expects its own scale/offset implicitly handled by the model matrix. + // The 's' factor is meant for primitives whose SDFs are defined relative to a unit size. + if (obj.params.x != 4.0) { // Only scale if not a plane + d = min(d, get_dist(q, obj.params) * s); + } else { + d = min(d, get_dist(q, obj.params)); + } + } else { // Internal + if (stack_ptr < 31) { + stack[stack_ptr] = node.left_idx; + stack_ptr++; + stack[stack_ptr] = node.obj_idx_or_right; + stack_ptr++; + } + } + } } return d; -} +}
\ No newline at end of file diff --git a/assets/final/shaders/renderer_3d.wgsl b/assets/final/shaders/renderer_3d.wgsl index f855052..4733f6f 100644 --- a/assets/final/shaders/renderer_3d.wgsl +++ b/assets/final/shaders/renderer_3d.wgsl @@ -15,6 +15,7 @@ struct VertexOutput { @location(1) color: vec4<f32>, @location(2) @interpolate(flat) instance_index: u32, @location(3) world_pos: vec3<f32>, + @location(4) transformed_normal: vec3<f32>, }; @vertex @@ -40,6 +41,14 @@ fn vs_main(@builtin(vertex_index) vertex_index: u32, let obj = object_data.objects[instance_index]; let obj_type = obj.params.x; + if (obj_type == 5.0) { // MESH + // For meshes, we use the actual vertex data, not proxy geometry. + // The position here is a placeholder, the real mesh data is handled by mesh_pipeline_. + var out: VertexOutput; + out.position = vec4<f32>(0.0, 0.0, 2.0, 1.0); // Outside far plane, so it's not rendered by this pipeline. + return out; + } + // Tight fit for Torus proxy hull (major radius 1.0, minor 0.4) if (obj_type == 3.0) { p.x = p.x * 1.5; @@ -56,6 +65,22 @@ fn vs_main(@builtin(vertex_index) vertex_index: u32, out.color = obj.color; out.instance_index = instance_index; out.world_pos = world_pos.xyz; + + // Correct normal transformation for meshes: transpose of inverse of model matrix + // For non-uniform scaling, this is necessary. For other primitives, we use their analytical normals. + if (obj_type == 5.0) { + // Calculate inverse transpose of the model matrix (upper 3x3 part) + let model_matrix = mat3x3<f32>(obj.model[0].xyz, obj.model[1].xyz, obj.model[2].xyz); + let normal_matrix = transpose(inverse(model_matrix)); + out.transformed_normal = normalize(normal_matrix * in.normal); + } else { + // For SDF primitives, we don't use vertex normals directly here; they are computed in the fragment shader. + // However, we still need to output a normal for the fragment shader to use if it were a rasterized primitive. + // The transformed_normal is not used by the SDF fragment shader, but for correctness, we'll pass it. + // If this were a rasterized mesh, it would be used. + out.transformed_normal = normalize(vec3<f32>(0.0, 1.0, 0.0)); // Placeholder for non-mesh types + } + return out; } @@ -64,8 +89,13 @@ fn vs_main(@builtin(vertex_index) vertex_index: u32, #include "render/lighting_utils" #include "ray_box" +struct FragmentOutput { + @location(0) color: vec4<f32>, + @builtin(frag_depth) depth: f32, +}; + @fragment -fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { +fn fs_main(in: VertexOutput) -> FragmentOutput { let obj = object_data.objects[in.instance_index]; let obj_type = obj.params.x; @@ -74,11 +104,10 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { var base_color = in.color.rgb; let light_dir = normalize(vec3<f32>(1.0, 1.0, 1.0)); - if (obj_type <= 0.0) { // Raster path + if (obj_type <= 0.0) { // Raster path (legacy or generic) p = in.world_pos; - let local_normal = normalize(cross(dpdx(in.local_pos), dpdy(in.local_pos))); - let normal_matrix = mat3x3<f32>(obj.inv_model[0].xyz, obj.inv_model[1].xyz, obj.inv_model[2].xyz); - normal = normalize(transpose(normal_matrix) * local_normal); + // Use the transformed normal passed from the vertex shader for rasterized objects + normal = normalize(in.transformed_normal); // Apply grid pattern to floor let uv = p.xz * 0.5; @@ -94,8 +123,10 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { let rd_local = normalize((obj.inv_model * vec4<f32>(rd_world, 0.0)).xyz); // Proxy box extent (matches vs_main) + // MESHES use obj.params.yzw for extent var extent = vec3<f32>(1.0); - if (obj_type == 3.0) { extent = vec3<f32>(1.5, 0.5, 1.5); } + if (obj.params.x == 3.0) { extent = vec3<f32>(1.5, 0.5, 1.5); } // Torus + else if (obj.params.x == 5.0) { extent = obj.params.yzw; } // MESH extent let bounds = ray_box_intersection(ro_local, rd_local, extent); @@ -105,7 +136,7 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { var hit = false; for (var i = 0; i < 64; i = i + 1) { let q = ro_local + rd_local * t; - let d_local = get_dist(q, obj_type); + let d_local = get_dist(q, obj.params); if (d_local < 0.0005) { hit = true; break; } t = t + d_local; if (t > bounds.t_exit) { break; } @@ -122,32 +153,32 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { let q_x1 = q_hit + e.xyy; let uv_x1 = vec2<f32>(atan2(q_x1.x, q_x1.z) / 6.28 + 0.5, acos(clamp(q_x1.y / length(q_x1), -1.0, 1.0)) / 3.14); let h_x1 = textureSample(noise_tex, noise_sampler, uv_x1).r; - let d_x1 = get_dist(q_x1, obj_type) - disp_strength * h_x1; + let d_x1 = get_dist(q_x1, obj.params) - disp_strength * h_x1; let q_x2 = q_hit - e.xyy; let uv_x2 = vec2<f32>(atan2(q_x2.x, q_x2.z) / 6.28 + 0.5, acos(clamp(q_x2.y / length(q_x2), -1.0, 1.0)) / 3.14); let h_x2 = textureSample(noise_tex, noise_sampler, uv_x2).r; - let d_x2 = get_dist(q_x2, obj_type) - disp_strength * h_x2; + let d_x2 = get_dist(q_x2, obj.params) - disp_strength * h_x2; let q_y1 = q_hit + e.yxy; let uv_y1 = vec2<f32>(atan2(q_y1.x, q_y1.z) / 6.28 + 0.5, acos(clamp(q_y1.y / length(q_y1), -1.0, 1.0)) / 3.14); let h_y1 = textureSample(noise_tex, noise_sampler, uv_y1).r; - let d_y1 = get_dist(q_y1, obj_type) - disp_strength * h_y1; + let d_y1 = get_dist(q_y1, obj.params) - disp_strength * h_y1; let q_y2 = q_hit - e.yxy; let uv_y2 = vec2<f32>(atan2(q_y2.x, q_y2.z) / 6.28 + 0.5, acos(clamp(q_y2.y / length(q_y2), -1.0, 1.0)) / 3.14); let h_y2 = textureSample(noise_tex, noise_sampler, uv_y2).r; - let d_y2 = get_dist(q_y2, obj_type) - disp_strength * h_y2; + let d_y2 = get_dist(q_y2, obj.params) - disp_strength * h_y2; let q_z1 = q_hit + e.yyx; let uv_z1 = vec2<f32>(atan2(q_z1.x, q_z1.z) / 6.28 + 0.5, acos(clamp(q_z1.y / length(q_z1), -1.0, 1.0)) / 3.14); let h_z1 = textureSample(noise_tex, noise_sampler, uv_z1).r; - let d_z1 = get_dist(q_z1, obj_type) - disp_strength * h_z1; + let d_z1 = get_dist(q_z1, obj.params) - disp_strength * h_z1; let q_z2 = q_hit - e.yyx; let uv_z2 = vec2<f32>(atan2(q_z2.x, q_z2.z) / 6.28 + 0.5, acos(clamp(q_z2.y / length(q_z2), -1.0, 1.0)) / 3.14); let h_z2 = textureSample(noise_tex, noise_sampler, uv_z2).r; - let d_z2 = get_dist(q_z2, obj_type) - disp_strength * h_z2; + let d_z2 = get_dist(q_z2, obj.params) - disp_strength * h_z2; let n_local = normalize(vec3<f32>(d_x1 - d_x2, d_y1 - d_y2, d_z1 - d_z2)); let normal_matrix = mat3x3<f32>(obj.inv_model[0].xyz, obj.inv_model[1].xyz, obj.inv_model[2].xyz); @@ -168,5 +199,13 @@ fn fs_main(in: VertexOutput) -> @location(0) vec4<f32> { let shadow = calc_shadow(p, light_dir, 0.05, 20.0, in.instance_index); let lit_color = calculate_lighting(base_color, normal, p, shadow); - return vec4<f32>(lit_color, 1.0); + + var out: FragmentOutput; + out.color = vec4<f32>(lit_color, 1.0); + + // Calculate and write correct depth + let clip_pos = globals.view_proj * vec4<f32>(p, 1.0); + out.depth = clip_pos.z / clip_pos.w; + + return out; }
\ No newline at end of file diff --git a/assets/final/test_assets_list.txt b/assets/final/test_assets_list.txt index c9dd83b..7cded99 100644 --- a/assets/final/test_assets_list.txt +++ b/assets/final/test_assets_list.txt @@ -5,5 +5,19 @@ SHADER_SNIPPET_A, NONE, shaders/test_snippet_a.wgsl, "Test snippet A" SHADER_SNIPPET_B, NONE, shaders/test_snippet_b.wgsl, "Test snippet B" PROC_NOISE_256, PROC(gen_noise, 4321, 8), _, "Procedural noise for testing" TEST_IMAGE, NONE, test_image.tga, "A test TGA image" +TEST_MESH, NONE, test_mesh.obj, "A simple test cube mesh" PROC_UNKNOWN, PROC(gen_unknown_func, 0), _, "Unknown proc function" PROC_FAIL, PROC(gen_noise, -1337, 8), _, "Failing proc function" + +# --- Required Shaders for Renderer3D --- +SHADER_MESH, NONE, shaders/mesh_render.wgsl, "Mesh Rasterization Shader" +SHADER_RENDERER_3D, NONE, shaders/renderer_3d.wgsl, "Hybrid 3D Renderer Shader" +SHADER_SKYBOX, NONE, shaders/skybox.wgsl, "Skybox background shader" +SHADER_COMMON_UNIFORMS, NONE, shaders/common_uniforms.wgsl, "Common Uniforms Snippet" +SHADER_MATH_SDF_SHAPES, NONE, shaders/math/sdf_shapes.wgsl, "SDF Shapes Snippet" +SHADER_MATH_SDF_UTILS, NONE, shaders/math/sdf_utils.wgsl, "SDF Utils Snippet" +SHADER_RENDER_SHADOWS, NONE, shaders/render/shadows.wgsl, "Shadows Snippet" +SHADER_RENDER_SCENE_QUERY_BVH, NONE, shaders/render/scene_query_bvh.wgsl, "Scene Query Snippet (BVH)" +SHADER_RENDER_SCENE_QUERY_LINEAR, NONE, shaders/render/scene_query_linear.wgsl, "Scene Query Snippet (Linear)" +SHADER_RENDER_LIGHTING_UTILS, NONE, shaders/render/lighting_utils.wgsl, "Lighting Utils Snippet" +SHADER_RAY_BOX, NONE, shaders/ray_box.wgsl, "Ray-Box Intersection Snippet"
\ No newline at end of file diff --git a/assets/final/test_mesh.obj b/assets/final/test_mesh.obj new file mode 100644 index 0000000..eb304d4 --- /dev/null +++ b/assets/final/test_mesh.obj @@ -0,0 +1,30 @@ +v -0.5 -0.5 0.5 +v 0.5 -0.5 0.5 +v 0.5 0.5 0.5 +v -0.5 0.5 0.5 +v -0.5 -0.5 -0.5 +v 0.5 -0.5 -0.5 +v 0.5 0.5 -0.5 +v -0.5 0.5 -0.5 +vn 0.0 0.0 1.0 +vn 0.0 0.0 -1.0 +vn 0.0 1.0 0.0 +vn 0.0 -1.0 0.0 +vn 1.0 0.0 0.0 +vn -1.0 0.0 0.0 +vt 0.0 0.0 +vt 1.0 0.0 +vt 1.0 1.0 +vt 0.0 1.0 +f 1/1/1 2/2/1 3/3/1 +f 1/1/1 3/3/1 4/4/1 +f 5/1/2 8/4/2 7/3/2 +f 5/1/2 7/3/2 6/2/2 +f 1/1/6 4/4/6 8/3/6 +f 1/1/6 8/3/6 5/2/6 +f 2/1/5 6/4/5 7/3/5 +f 2/1/5 7/3/5 3/2/5 +f 4/1/3 3/4/3 7/3/3 +f 4/1/3 7/3/3 8/2/3 +f 1/1/4 5/4/4 6/3/4 +f 1/1/4 6/3/4 2/2/4 |
