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