Welcome to mirror list, hosted at ThFree Co, Russian Federation.

water_tess.raw-tess-in.tese « tese « shaders-msl - github.com/KhronosGroup/SPIRV-Cross.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 32d6bc9391bdbd8a23ff621d5ab8e3ab5024fa27 (plain)
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
#version 310 es
#extension GL_EXT_tessellation_shader : require
precision highp int;

layout(cw, quads, fractional_even_spacing) in;

layout(location = 0) patch in vec2 vOutPatchPosBase;
layout(location = 1) patch in vec4 vPatchLods;

layout(binding = 1, std140) uniform UBO
{
    mat4 uMVP;
    vec4 uScale;
    vec2 uInvScale;
    vec3 uCamPos;
    vec2 uPatchSize;
    vec2 uInvHeightmapSize;
};
layout(binding = 0) uniform mediump sampler2D uHeightmapDisplacement;

layout(location = 0) highp out vec3 vWorld;
layout(location = 1) highp out vec4 vGradNormalTex;

vec2 lerp_vertex(vec2 tess_coord)
{
    return vOutPatchPosBase + tess_coord * uPatchSize;
}

mediump vec2 lod_factor(vec2 tess_coord)
{
    mediump vec2 x = mix(vPatchLods.yx, vPatchLods.zw, tess_coord.x);
    mediump float level = mix(x.x, x.y, tess_coord.y);
    mediump float floor_level = floor(level);
    mediump float fract_level = level - floor_level;
    return vec2(floor_level, fract_level);
}

mediump vec3 sample_height_displacement(vec2 uv, vec2 off, mediump vec2 lod)
{
    return mix(
            textureLod(uHeightmapDisplacement, uv + 0.5 * off, lod.x).xyz,
            textureLod(uHeightmapDisplacement, uv + 1.0 * off, lod.x + 1.0).xyz,
            lod.y);
}

void main()
{
    vec2 tess_coord = gl_TessCoord.xy;
    vec2 pos = lerp_vertex(tess_coord);
    mediump vec2 lod = lod_factor(tess_coord);

    vec2 tex = pos * uInvHeightmapSize.xy;
    pos *= uScale.xy;

    mediump float delta_mod = exp2(lod.x);
    vec2 off = uInvHeightmapSize.xy * delta_mod;

    vGradNormalTex = vec4(tex + 0.5 * uInvHeightmapSize.xy, tex * uScale.zw);
    vec3 height_displacement = sample_height_displacement(tex, off, lod);

    pos += height_displacement.yz;
    vWorld = vec3(pos.x, height_displacement.x, pos.y);
    gl_Position = uMVP * vec4(vWorld, 1.0);
}