-
Notifications
You must be signed in to change notification settings - Fork 619
/
FrustumCulling_cs.ts
98 lines (76 loc) · 2.44 KB
/
FrustumCulling_cs.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/**
* @internal
*/
export let FrustumCulling_cs: string = /*wgsl*/ `
#include "GlobalUniform"
struct RenderBound{
index:f32,
}
struct Uniforms {
matrix : array<mat4x4<f32>>
};
//@group(0) @binding(0) var<uniform> globalUniform: GlobalUniform;
@group(0) @binding(1) var<storage, read> models : Uniforms;
@group(0) @binding(2) var<storage, read> planes: array<vec4<f32>,7>;
@group(0) @binding(3) var<storage, read> cullingList: array<RenderBound>;
@group(0) @binding(4) var<storage,read_write> outBuffer: array<f32>;
var<private> boundPoints : array<vec4<f32>,8> ;
fn IsInClipSpace( coord : vec4<f32> ) -> bool {
return -coord.w <= coord.x && coord.x <= coord.w
&& -coord.w <= coord.y && coord.y <= coord.w
&& -coord.w <= coord.z && coord.z <= coord.w;
}
fn IsOutsideThePlane( plane: vec4<f32>, pointPosition : vec3<f32> ) -> bool{
if(dot(plane.xyz, pointPosition) + plane.w > 0.0){
return true;
}
return false;
}
fn containsBox( size:vec3<f32> , center:vec3<f32> ) -> f32 {
var c = 0.0 ;
var d = 0.0 ;
var r = max(size.x, size.y);
var sr = max(r , size.z);
var scx = center.x;
var scy = center.y;
var scz = center.z;
for(var p:i32 = 0; p < 6 ; p = p + 1 ){
var plane = planes[p];
d = plane.x * scx + plane.y * scy + plane.z * scz + plane.w;
if (d <= -sr) {
return 0.0;
}
if (d > sr) {
c+=1.0;
}
}
if( c >= 6.0 ){
return 2.0 ;
}else{
return 1.0 ;
}
}
@compute @workgroup_size( 128 )
fn CsMain( @builtin(workgroup_id) workgroup_id : vec3<u32> , @builtin(global_invocation_id) globalInvocation_id : vec3<u32>)
{
let id = globalInvocation_id.x ;
if(id + 1u > u32(planes[6].x) ){
outBuffer[id] = f32(0.0);
return ;
}
let renderBound = cullingList[id];
let boundID = i32(renderBound.index) ;
var plane = planes[0];
let worldMatrix = models.matrix[boundID];
let projMat = globalUniform.projMat ;
let const_boundMin : vec3<f32> = vec3<f32>(-0.5,-0.5,-0.5) ;
let const_boundMax : vec3<f32> = vec3<f32>(0.5,0.5,0.5) ;
let boundMin = worldMatrix * vec4<f32>(const_boundMin, 1.0);
let boundMax = worldMatrix * vec4<f32>(const_boundMax, 1.0);
let size = abs( boundMax.xyz - boundMin.xyz ) * 0.65 ;
let center = worldMatrix[3].xyz ;
var isIn :f32 = 0.0 ;
isIn = containsBox(size,center);
outBuffer[id] = f32(isIn);
}
`