#version 430 layout(triangles) in; layout (binding = 0) uniform sampler2D heightmap; uniform mat4 model; uniform mat4 projection; uniform mat4 view; in PipelineData { vec4 position; vec2 texture_coordinate; } te_in[]; out PipelineData { vec4 position; vec2 texture_coordinate; } te_out; void main() { te_out.texture_coordinate = gl_TessCoord.x * te_in[0].texture_coordinate; te_out.texture_coordinate += gl_TessCoord.y * te_in[1].texture_coordinate; te_out.texture_coordinate += gl_TessCoord.z * te_in[2].texture_coordinate; te_out.position = gl_TessCoord.x * te_in[0].position; te_out.position += gl_TessCoord.y * te_in[1].position; te_out.position += gl_TessCoord.z * te_in[2].position; te_out.position.y += texture(heightmap, te_out.texture_coordinate).r; mat4 pvm = projection * view * model; gl_Position = pvm * te_out.position; }