11 static constexpr
const char* vertex = R
"(uniform mat4 u_matrix;
12 uniform bool u_scale_with_map;
13 uniform bool u_pitch_with_map;
14 uniform vec2 u_extrude_scale;
15 uniform lowp float u_device_pixel_ratio;
16 uniform highp float u_camera_to_center_distance;
18 layout (location = 0) in vec2 a_pos;
21 #ifndef HAS_UNIFORM_u_color
22 uniform lowp float u_color_t;
23 layout (location = 1) in highp vec4 a_color;
26 uniform highp vec4 u_color;
28 #ifndef HAS_UNIFORM_u_radius
29 uniform lowp float u_radius_t;
30 layout (location = 2) in mediump vec2 a_radius;
31 out mediump float radius;
33 uniform mediump float u_radius;
35 #ifndef HAS_UNIFORM_u_blur
36 uniform lowp float u_blur_t;
37 layout (location = 3) in lowp vec2 a_blur;
40 uniform lowp float u_blur;
42 #ifndef HAS_UNIFORM_u_opacity
43 uniform lowp float u_opacity_t;
44 layout (location = 4) in lowp vec2 a_opacity;
45 out lowp float opacity;
47 uniform lowp float u_opacity;
49 #ifndef HAS_UNIFORM_u_stroke_color
50 uniform lowp float u_stroke_color_t;
51 layout (location = 5) in highp vec4 a_stroke_color;
52 out highp vec4 stroke_color;
54 uniform highp vec4 u_stroke_color;
56 #ifndef HAS_UNIFORM_u_stroke_width
57 uniform lowp float u_stroke_width_t;
58 layout (location = 6) in mediump vec2 a_stroke_width;
59 out mediump float stroke_width;
61 uniform mediump float u_stroke_width;
63 #ifndef HAS_UNIFORM_u_stroke_opacity
64 uniform lowp float u_stroke_opacity_t;
65 layout (location = 7) in lowp vec2 a_stroke_opacity;
66 out lowp float stroke_opacity;
68 uniform lowp float u_stroke_opacity;
72 #ifndef HAS_UNIFORM_u_color
73 color = unpack_mix_color(a_color, u_color_t);
75 highp vec4 color = u_color;
77 #ifndef HAS_UNIFORM_u_radius
78 radius = unpack_mix_vec2(a_radius, u_radius_t);
80 mediump float radius = u_radius;
82 #ifndef HAS_UNIFORM_u_blur
83 blur = unpack_mix_vec2(a_blur, u_blur_t);
85 lowp float blur = u_blur;
87 #ifndef HAS_UNIFORM_u_opacity
88 opacity = unpack_mix_vec2(a_opacity, u_opacity_t);
90 lowp float opacity = u_opacity;
92 #ifndef HAS_UNIFORM_u_stroke_color
93 stroke_color = unpack_mix_color(a_stroke_color, u_stroke_color_t);
95 highp vec4 stroke_color = u_stroke_color;
97 #ifndef HAS_UNIFORM_u_stroke_width
98 stroke_width = unpack_mix_vec2(a_stroke_width, u_stroke_width_t);
100 mediump float stroke_width = u_stroke_width;
102 #ifndef HAS_UNIFORM_u_stroke_opacity
103 stroke_opacity = unpack_mix_vec2(a_stroke_opacity, u_stroke_opacity_t);
105 lowp float stroke_opacity = u_stroke_opacity;
108 // unencode the extrusion vector that we snuck into the a_pos vector
109 vec2 extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);
111 // multiply a_pos by 0.5, since we had it * 2 in order to sneak
113 vec2 circle_center = floor(a_pos * 0.5);
114 if (u_pitch_with_map) {
115 vec2 corner_position = circle_center;
116 if (u_scale_with_map) {
117 corner_position += extrude * (radius + stroke_width) * u_extrude_scale;
119 // Pitching the circle with the map effectively scales it with the map
120 // To counteract the effect for pitch-scale: viewport, we rescale the
121 // whole circle based on the pitch scaling effect at its central point
122 vec4 projected_center = u_matrix * vec4(circle_center, 0, 1);
123 corner_position += extrude * (radius + stroke_width) * u_extrude_scale * (projected_center.w / u_camera_to_center_distance);
126 gl_Position = u_matrix * vec4(corner_position, 0, 1);
128 gl_Position = u_matrix * vec4(circle_center, 0, 1);
130 if (u_scale_with_map) {
131 gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * u_camera_to_center_distance;
133 gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * gl_Position.w;
137 // This is a minimum blur distance that serves as a faux-antialiasing for
138 // the circle. since blur is a ratio of the circle's size and the intent is
139 // to keep the blur at roughly 1px, the two are inversely related.
140 lowp float antialiasblur = 1.0 / u_device_pixel_ratio / (radius + stroke_width);
142 v_data = vec3(extrude.x, extrude.y, antialiasblur);
145 static constexpr
const char* fragment = R
"(in vec3 v_data;
147 #ifndef HAS_UNIFORM_u_color
150 uniform highp vec4 u_color;
152 #ifndef HAS_UNIFORM_u_radius
153 in mediump float radius;
155 uniform mediump float u_radius;
157 #ifndef HAS_UNIFORM_u_blur
160 uniform lowp float u_blur;
162 #ifndef HAS_UNIFORM_u_opacity
163 in lowp float opacity;
165 uniform lowp float u_opacity;
167 #ifndef HAS_UNIFORM_u_stroke_color
168 in highp vec4 stroke_color;
170 uniform highp vec4 u_stroke_color;
172 #ifndef HAS_UNIFORM_u_stroke_width
173 in mediump float stroke_width;
175 uniform mediump float u_stroke_width;
177 #ifndef HAS_UNIFORM_u_stroke_opacity
178 in lowp float stroke_opacity;
180 uniform lowp float u_stroke_opacity;
184 #ifdef HAS_UNIFORM_u_color
185 highp vec4 color = u_color;
187 #ifdef HAS_UNIFORM_u_radius
188 mediump float radius = u_radius;
190 #ifdef HAS_UNIFORM_u_blur
191 lowp float blur = u_blur;
193 #ifdef HAS_UNIFORM_u_opacity
194 lowp float opacity = u_opacity;
196 #ifdef HAS_UNIFORM_u_stroke_color
197 highp vec4 stroke_color = u_stroke_color;
199 #ifdef HAS_UNIFORM_u_stroke_width
200 mediump float stroke_width = u_stroke_width;
202 #ifdef HAS_UNIFORM_u_stroke_opacity
203 lowp float stroke_opacity = u_stroke_opacity;
206 vec2 extrude = v_data.xy;
207 float extrude_length = length(extrude);
209 lowp float antialiasblur = v_data.z;
210 float antialiased_blur = -max(blur, antialiasblur);
212 float opacity_t = smoothstep(0.0, antialiased_blur, extrude_length - 1.0);
214 float color_t = stroke_width < 0.01 ? 0.0 : smoothstep(
217 extrude_length - radius / (radius + stroke_width)
220 fragColor = opacity_t * mix(color * opacity, stroke_color * stroke_opacity, color_t);
222 #ifdef OVERDRAW_INSPECTOR
223 fragColor = vec4(1.0);
@ OpenGL
The OpenGL API backend.
BuiltIn
This enum is used with the ShaderSource template to select source code for the desired program and gr...
Select shader source based on a program type and a desired graphics API.