1#version 310 es 2#extension GL_EXT_tessellation_shader : require 3precision highp int; 4 5layout(cw, quads, fractional_even_spacing) in; 6 7layout(location = 0) patch in vec2 vOutPatchPosBase; 8layout(location = 1) patch in vec4 vPatchLods; 9 10layout(binding = 1, std140) uniform UBO 11{ 12 mat4 uMVP; 13 vec4 uScale; 14 vec2 uInvScale; 15 vec3 uCamPos; 16 vec2 uPatchSize; 17 vec2 uInvHeightmapSize; 18}; 19layout(binding = 0) uniform mediump sampler2D uHeightmapDisplacement; 20 21layout(location = 0) highp out vec3 vWorld; 22layout(location = 1) highp out vec4 vGradNormalTex; 23 24vec2 lerp_vertex(vec2 tess_coord) 25{ 26 return vOutPatchPosBase + tess_coord * uPatchSize; 27} 28 29mediump vec2 lod_factor(vec2 tess_coord) 30{ 31 mediump vec2 x = mix(vPatchLods.yx, vPatchLods.zw, tess_coord.x); 32 mediump float level = mix(x.x, x.y, tess_coord.y); 33 mediump float floor_level = floor(level); 34 mediump float fract_level = level - floor_level; 35 return vec2(floor_level, fract_level); 36} 37 38mediump vec3 sample_height_displacement(vec2 uv, vec2 off, mediump vec2 lod) 39{ 40 return mix( 41 textureLod(uHeightmapDisplacement, uv + 0.5 * off, lod.x).xyz, 42 textureLod(uHeightmapDisplacement, uv + 1.0 * off, lod.x + 1.0).xyz, 43 lod.y); 44} 45 46void main() 47{ 48 vec2 tess_coord = gl_TessCoord.xy; 49 vec2 pos = lerp_vertex(tess_coord); 50 mediump vec2 lod = lod_factor(tess_coord); 51 52 vec2 tex = pos * uInvHeightmapSize.xy; 53 pos *= uScale.xy; 54 55 mediump float delta_mod = exp2(lod.x); 56 vec2 off = uInvHeightmapSize.xy * delta_mod; 57 58 vGradNormalTex = vec4(tex + 0.5 * uInvHeightmapSize.xy, tex * uScale.zw); 59 vec3 height_displacement = sample_height_displacement(tex, off, lod); 60 61 pos += height_displacement.yz; 62 vWorld = vec3(pos.x, height_displacement.x, pos.y); 63 gl_Position = uMVP * vec4(vWorld, 1.0); 64} 65 66