Misc meshlet changes (#13705)
* Rename cull_meshlets -> cull_clusters * Rename meshlet_visible -> cluster_visible * Add an if statement around meshlet_second_pass_candidates writes, maybe a small bit of performance.
This commit is contained in:
parent
31be32ff10
commit
175e146228
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
@compute
|
@compute
|
||||||
@workgroup_size(128, 1, 1) // 128 threads per workgroup, 1 cluster per thread
|
@workgroup_size(128, 1, 1) // 128 threads per workgroup, 1 cluster per thread
|
||||||
fn cull_meshlets(
|
fn cull_clusters(
|
||||||
@builtin(workgroup_id) workgroup_id: vec3<u32>,
|
@builtin(workgroup_id) workgroup_id: vec3<u32>,
|
||||||
@builtin(num_workgroups) num_workgroups: vec3<u32>,
|
@builtin(num_workgroups) num_workgroups: vec3<u32>,
|
||||||
@builtin(local_invocation_id) local_invocation_id: vec3<u32>,
|
@builtin(local_invocation_id) local_invocation_id: vec3<u32>,
|
||||||
@ -100,25 +100,27 @@ fn cull_meshlets(
|
|||||||
let occluder_depth = min(min(depth_quad_a, depth_quad_b), min(depth_quad_c, depth_quad_d));
|
let occluder_depth = min(min(depth_quad_a, depth_quad_b), min(depth_quad_c, depth_quad_d));
|
||||||
|
|
||||||
// Check whether or not the cluster would be occluded if drawn
|
// Check whether or not the cluster would be occluded if drawn
|
||||||
var meshlet_visible: bool;
|
var cluster_visible: bool;
|
||||||
if view.clip_from_view[3][3] == 1.0 {
|
if view.clip_from_view[3][3] == 1.0 {
|
||||||
// Orthographic
|
// Orthographic
|
||||||
let sphere_depth = view.clip_from_view[3][2] + (culling_bounding_sphere_center_view_space.z + culling_bounding_sphere_radius) * view.clip_from_view[2][2];
|
let sphere_depth = view.clip_from_view[3][2] + (culling_bounding_sphere_center_view_space.z + culling_bounding_sphere_radius) * view.clip_from_view[2][2];
|
||||||
meshlet_visible = sphere_depth >= occluder_depth;
|
cluster_visible = sphere_depth >= occluder_depth;
|
||||||
} else {
|
} else {
|
||||||
// Perspective
|
// Perspective
|
||||||
let sphere_depth = -view.clip_from_view[3][2] / (culling_bounding_sphere_center_view_space.z + culling_bounding_sphere_radius);
|
let sphere_depth = -view.clip_from_view[3][2] / (culling_bounding_sphere_center_view_space.z + culling_bounding_sphere_radius);
|
||||||
meshlet_visible = sphere_depth >= occluder_depth;
|
cluster_visible = sphere_depth >= occluder_depth;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write if the cluster should be occlusion tested in the second pass
|
// Write if the cluster should be occlusion tested in the second pass
|
||||||
#ifdef MESHLET_FIRST_CULLING_PASS
|
#ifdef MESHLET_FIRST_CULLING_PASS
|
||||||
let second_pass_candidate = u32(!meshlet_visible) << cluster_id % 32u;
|
if !cluster_visible {
|
||||||
atomicOr(&meshlet_second_pass_candidates[cluster_id / 32u], second_pass_candidate);
|
let bit = 1u << cluster_id % 32u;
|
||||||
|
atomicOr(&meshlet_second_pass_candidates[cluster_id / 32u], bit);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Append a list of this cluster's triangles to draw if not culled
|
// Append a list of this cluster's triangles to draw if not culled
|
||||||
if meshlet_visible {
|
if cluster_visible {
|
||||||
let meshlet_triangle_count = meshlets[meshlet_id].triangle_count;
|
let meshlet_triangle_count = meshlets[meshlet_id].triangle_count;
|
||||||
let buffer_start = atomicAdd(&draw_indirect_args.vertex_count, meshlet_triangle_count * 3u) / 3u;
|
let buffer_start = atomicAdd(&draw_indirect_args.vertex_count, meshlet_triangle_count * 3u) / 3u;
|
||||||
let cluster_id_packed = cluster_id << 6u;
|
let cluster_id_packed = cluster_id << 6u;
|
||||||
@ -136,7 +136,7 @@ impl Plugin for MeshletPlugin {
|
|||||||
load_internal_asset!(
|
load_internal_asset!(
|
||||||
app,
|
app,
|
||||||
MESHLET_CULLING_SHADER_HANDLE,
|
MESHLET_CULLING_SHADER_HANDLE,
|
||||||
"cull_meshlets.wgsl",
|
"cull_clusters.wgsl",
|
||||||
Shader::from_wgsl
|
Shader::from_wgsl
|
||||||
);
|
);
|
||||||
load_internal_asset!(
|
load_internal_asset!(
|
||||||
|
|||||||
@ -67,7 +67,7 @@ impl FromWorld for MeshletPipelines {
|
|||||||
"MESHLET_CULLING_PASS".into(),
|
"MESHLET_CULLING_PASS".into(),
|
||||||
"MESHLET_FIRST_CULLING_PASS".into(),
|
"MESHLET_FIRST_CULLING_PASS".into(),
|
||||||
],
|
],
|
||||||
entry_point: "cull_meshlets".into(),
|
entry_point: "cull_clusters".into(),
|
||||||
}),
|
}),
|
||||||
|
|
||||||
cull_second: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {
|
cull_second: pipeline_cache.queue_compute_pipeline(ComputePipelineDescriptor {
|
||||||
@ -79,7 +79,7 @@ impl FromWorld for MeshletPipelines {
|
|||||||
"MESHLET_CULLING_PASS".into(),
|
"MESHLET_CULLING_PASS".into(),
|
||||||
"MESHLET_SECOND_CULLING_PASS".into(),
|
"MESHLET_SECOND_CULLING_PASS".into(),
|
||||||
],
|
],
|
||||||
entry_point: "cull_meshlets".into(),
|
entry_point: "cull_clusters".into(),
|
||||||
}),
|
}),
|
||||||
|
|
||||||
downsample_depth_first: pipeline_cache.queue_compute_pipeline(
|
downsample_depth_first: pipeline_cache.queue_compute_pipeline(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user