37 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			GLSL
		
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			GLSL
		
	
	
	
| #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);
 | |
| }
 |