Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/shaders/draw_visibility_comp.glsl
- This file was added.
| /** | |||||
| * Compute visibility of each resource bounds for a given view. | |||||
| */ | |||||
| /* TODO(fclem): This could be augmented by a 2 pass occlusion culling system. */ | |||||
| #pragma BLENDER_REQUIRE(common_math_lib.glsl) | |||||
| #pragma BLENDER_REQUIRE(common_intersect_lib.glsl) | |||||
| shared uint shared_result; | |||||
| void mask_visibility_bit() | |||||
| { | |||||
| uint bit = 1u << gl_LocalInvocationID.x; | |||||
| atomicAnd(visibility_buf[gl_WorkGroupID.x], ~bit); | |||||
| } | |||||
| void main() | |||||
| { | |||||
| if (gl_GlobalInvocationID.x >= resource_len) { | |||||
| return; | |||||
| } | |||||
| ObjectBounds bounds = bounds_buf[gl_GlobalInvocationID.x]; | |||||
| if (bounds.bounding_sphere.w != -1.0) { | |||||
| IsectBox box = isect_data_setup(bounds.bounding_corners[0].xyz, | |||||
| bounds.bounding_corners[1].xyz, | |||||
| bounds.bounding_corners[2].xyz, | |||||
| bounds.bounding_corners[3].xyz); | |||||
| Sphere bounding_sphere = Sphere(bounds.bounding_sphere.xyz, bounds.bounding_sphere.w); | |||||
| Sphere inscribed_sphere = Sphere(bounds.bounding_sphere.xyz, bounds._inner_sphere_radius); | |||||
| if (intersect_view(inscribed_sphere) == true) { | |||||
| /* Visible. */ | |||||
| } | |||||
| else if (intersect_view(bounding_sphere) == false) { | |||||
| /* Not visible. */ | |||||
| mask_visibility_bit(); | |||||
| } | |||||
| else if (intersect_view(box) == false) { | |||||
| /* Not visible. */ | |||||
| mask_visibility_bit(); | |||||
| } | |||||
| } | |||||
| } | |||||
| No newline at end of file | |||||