| #version 310 es | |
| #extension GL_EXT_tessellation_shader : require | |
| #extension GL_EXT_gpu_shader5 : require | |
| layout(triangles, equal_spacing) in; | |
| layout(location = 0) in highp vec2 in_te_position[]; | |
| layout(location = 0) out mediump vec4 in_f_color; | |
| precise gl_Position; | |
| void main(void) { | |
| highp vec2 pos = gl_TessCoord.x * in_te_position[0] + | |
| gl_TessCoord.y * in_te_position[1] + | |
| gl_TessCoord.z * in_te_position[2]; | |
| highp float f = | |
| sqrt(3.0 * min(gl_TessCoord.x, min(gl_TessCoord.y, gl_TessCoord.z))) * | |
| 0.5 + | |
| 0.5; | |
| in_f_color = vec4(gl_TessCoord * f, 1.0); | |
| // Offset the position slightly, based on the parity of the bits in the float | |
| // representation. | |
| // This is done to detect possible small differences in edge vertex positions | |
| // between patches. | |
| uvec2 bits = floatBitsToUint(pos); | |
| uint numBits = 0u; | |
| for (uint i = 0u; i < 32u; i++) | |
| numBits += | |
| ((bits[0] << i) & 1u) + ((bits[1] << i) & 1u); | |
| pos += float(numBits & 1u) * 0.04; | |
| gl_Position = vec4(pos, 0.0, 1.0); | |
| } |