• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#version 310 es
2#extension GL_EXT_tessellation_shader : require
3layout(vertices = 1) out;
4
5layout(binding = 0, std140) uniform UBO
6{
7    vec4 uScale;
8    vec3 uCamPos;
9    vec2 uPatchSize;
10    vec2 uMaxTessLevel;
11    float uDistanceMod;
12    vec4 uFrustum[6];
13} _41;
14
15layout(location = 1) patch out vec2 vOutPatchPosBase;
16layout(location = 2) patch out vec4 vPatchLods;
17layout(location = 0) in vec2 vPatchPosBase[];
18
19bool frustum_cull(vec2 p0)
20{
21    vec2 min_xz = (p0 - vec2(10.0)) * _41.uScale.xy;
22    vec2 max_xz = ((p0 + _41.uPatchSize) + vec2(10.0)) * _41.uScale.xy;
23    vec3 bb_min = vec3(min_xz.x, -10.0, min_xz.y);
24    vec3 bb_max = vec3(max_xz.x, 10.0, max_xz.y);
25    vec3 center = (bb_min + bb_max) * 0.5;
26    float radius = 0.5 * length(bb_max - bb_min);
27    vec3 f0 = vec3(dot(_41.uFrustum[0], vec4(center, 1.0)), dot(_41.uFrustum[1], vec4(center, 1.0)), dot(_41.uFrustum[2], vec4(center, 1.0)));
28    vec3 f1 = vec3(dot(_41.uFrustum[3], vec4(center, 1.0)), dot(_41.uFrustum[4], vec4(center, 1.0)), dot(_41.uFrustum[5], vec4(center, 1.0)));
29    bool _205 = any(lessThanEqual(f0, vec3(-radius)));
30    bool _215;
31    if (!_205)
32    {
33        _215 = any(lessThanEqual(f1, vec3(-radius)));
34    }
35    else
36    {
37        _215 = _205;
38    }
39    return !_215;
40}
41
42float lod_factor(vec2 pos_)
43{
44    vec2 pos = pos_ * _41.uScale.xy;
45    vec3 dist_to_cam = _41.uCamPos - vec3(pos.x, 0.0, pos.y);
46    float level = log2((length(dist_to_cam) + 9.9999997473787516355514526367188e-05) * _41.uDistanceMod);
47    return clamp(level, 0.0, _41.uMaxTessLevel.x);
48}
49
50vec4 tess_level(vec4 lod)
51{
52    return exp2(-lod) * _41.uMaxTessLevel.y;
53}
54
55float tess_level(float lod)
56{
57    return _41.uMaxTessLevel.y * exp2(-lod);
58}
59
60void compute_tess_levels(vec2 p0)
61{
62    vOutPatchPosBase = p0;
63    vec2 param = p0 + (vec2(-0.5) * _41.uPatchSize);
64    float l00 = lod_factor(param);
65    vec2 param_1 = p0 + (vec2(0.5, -0.5) * _41.uPatchSize);
66    float l10 = lod_factor(param_1);
67    vec2 param_2 = p0 + (vec2(1.5, -0.5) * _41.uPatchSize);
68    float l20 = lod_factor(param_2);
69    vec2 param_3 = p0 + (vec2(-0.5, 0.5) * _41.uPatchSize);
70    float l01 = lod_factor(param_3);
71    vec2 param_4 = p0 + (vec2(0.5) * _41.uPatchSize);
72    float l11 = lod_factor(param_4);
73    vec2 param_5 = p0 + (vec2(1.5, 0.5) * _41.uPatchSize);
74    float l21 = lod_factor(param_5);
75    vec2 param_6 = p0 + (vec2(-0.5, 1.5) * _41.uPatchSize);
76    float l02 = lod_factor(param_6);
77    vec2 param_7 = p0 + (vec2(0.5, 1.5) * _41.uPatchSize);
78    float l12 = lod_factor(param_7);
79    vec2 param_8 = p0 + (vec2(1.5) * _41.uPatchSize);
80    float l22 = lod_factor(param_8);
81    vec4 lods = vec4(dot(vec4(l01, l11, l02, l12), vec4(0.25)), dot(vec4(l00, l10, l01, l11), vec4(0.25)), dot(vec4(l10, l20, l11, l21), vec4(0.25)), dot(vec4(l11, l21, l12, l22), vec4(0.25)));
82    vPatchLods = lods;
83    vec4 outer_lods = min(lods, lods.yzwx);
84    vec4 param_9 = outer_lods;
85    vec4 levels = tess_level(param_9);
86    gl_TessLevelOuter[0] = levels.x;
87    gl_TessLevelOuter[1] = levels.y;
88    gl_TessLevelOuter[2] = levels.z;
89    gl_TessLevelOuter[3] = levels.w;
90    float min_lod = min(min(lods.x, lods.y), min(lods.z, lods.w));
91    float param_10 = min(min_lod, l11);
92    float inner = tess_level(param_10);
93    gl_TessLevelInner[0] = inner;
94    gl_TessLevelInner[1] = inner;
95}
96
97void main()
98{
99    vec2 p0 = vPatchPosBase[0];
100    vec2 param = p0;
101    if (!frustum_cull(param))
102    {
103        gl_TessLevelOuter[0] = -1.0;
104        gl_TessLevelOuter[1] = -1.0;
105        gl_TessLevelOuter[2] = -1.0;
106        gl_TessLevelOuter[3] = -1.0;
107        gl_TessLevelInner[0] = -1.0;
108        gl_TessLevelInner[1] = -1.0;
109    }
110    else
111    {
112        vec2 param_1 = p0;
113        compute_tess_levels(param_1);
114    }
115}
116
117