• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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