OpenGL: new built-in point shader, clean up other shader names

Smooth round point with outline (uniform color) and fill (varying color).

Updated shader naming scheme: a shader that doesn't deal with color does not have to say "no color". Vertex shaders do not have to say "uniform color" since their frag counterpart actually has the uniform. Each name should describe what that shader *does*, not what it *doesn't do*.
This commit is contained in:
Mike Erwin
2016-10-15 02:30:59 -04:00
parent 48db35468f
commit 2df27995f9
10 changed files with 108 additions and 18 deletions

View File

@@ -129,14 +129,14 @@ set(SRC
data_to_c_simple(shaders/gpu_shader_depth_only_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_uniform_color_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_flat_color_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_no_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_flat_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_smooth_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_smooth_color_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_texture_2D_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_texture_rect_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_texture_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_no_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_flat_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_smooth_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_smooth_color_frag.glsl SRC)
@@ -144,13 +144,15 @@ data_to_c_simple(shaders/gpu_shader_3D_smooth_color_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_point_uniform_color_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_point_uniform_color_smooth_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_point_uniform_color_outline_smooth_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_point_varying_color_outline_smooth_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_point_varying_color_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_point_fixed_size_varying_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_point_varying_size_no_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_point_varying_size_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_3D_point_varying_size_varying_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_point_varying_size_varying_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_point_uniform_size_uniform_color_smooth_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_point_uniform_size_uniform_color_outline_smooth_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_point_uniform_size_smooth_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_point_uniform_size_outline_smooth_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_point_uniform_size_varying_color_outline_smooth_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_text_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_text_frag.glsl SRC)

View File

@@ -108,6 +108,7 @@ typedef enum GPUBuiltinShader {
GPU_SHADER_2D_POINT_FIXED_SIZE_UNIFORM_COLOR,
GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_SMOOTH,
GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_SMOOTH,
GPU_SHADER_2D_POINT_UNIFORM_SIZE_VARYING_COLOR_OUTLINE_SMOOTH,
GPU_SHADER_2D_POINT_VARYING_SIZE_VARYING_COLOR,
GPU_SHADER_3D_POINT_FIXED_SIZE_UNIFORM_COLOR,
GPU_SHADER_3D_POINT_FIXED_SIZE_VARYING_COLOR,

View File

@@ -49,14 +49,14 @@
extern char datatoc_gpu_shader_depth_only_frag_glsl[];
extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
extern char datatoc_gpu_shader_flat_color_frag_glsl[];
extern char datatoc_gpu_shader_2D_no_color_vert_glsl[];
extern char datatoc_gpu_shader_2D_vert_glsl[];
extern char datatoc_gpu_shader_2D_flat_color_vert_glsl[];
extern char datatoc_gpu_shader_2D_smooth_color_vert_glsl[];
extern char datatoc_gpu_shader_2D_smooth_color_frag_glsl[];
extern char datatoc_gpu_shader_2D_texture_vert_glsl[];
extern char datatoc_gpu_shader_2D_texture_2D_frag_glsl[];
extern char datatoc_gpu_shader_2D_texture_rect_frag_glsl[];
extern char datatoc_gpu_shader_3D_no_color_vert_glsl[];
extern char datatoc_gpu_shader_3D_vert_glsl[];
extern char datatoc_gpu_shader_3D_flat_color_vert_glsl[];
extern char datatoc_gpu_shader_3D_smooth_color_vert_glsl[];
extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
@@ -64,13 +64,15 @@ extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
extern char datatoc_gpu_shader_point_uniform_color_frag_glsl[];
extern char datatoc_gpu_shader_point_uniform_color_smooth_frag_glsl[];
extern char datatoc_gpu_shader_point_uniform_color_outline_smooth_frag_glsl[];
extern char datatoc_gpu_shader_point_varying_color_outline_smooth_frag_glsl[];
extern char datatoc_gpu_shader_point_varying_color_frag_glsl[];
extern char datatoc_gpu_shader_3D_point_fixed_size_varying_color_vert_glsl[];
extern char datatoc_gpu_shader_3D_point_varying_size_no_color_vert_glsl[];
extern char datatoc_gpu_shader_3D_point_varying_size_vert_glsl[];
extern char datatoc_gpu_shader_3D_point_varying_size_varying_color_vert_glsl[];
extern char datatoc_gpu_shader_2D_point_varying_size_varying_color_vert_glsl[];
extern char datatoc_gpu_shader_2D_point_uniform_size_uniform_color_smooth_vert_glsl[];
extern char datatoc_gpu_shader_2D_point_uniform_size_uniform_color_outline_smooth_vert_glsl[];
extern char datatoc_gpu_shader_2D_point_uniform_size_smooth_vert_glsl[];
extern char datatoc_gpu_shader_2D_point_uniform_size_outline_smooth_vert_glsl[];
extern char datatoc_gpu_shader_2D_point_uniform_size_varying_color_outline_smooth_vert_glsl[];
extern char datatoc_gpu_shader_text_vert_glsl[];
extern char datatoc_gpu_shader_text_frag_glsl[];
@@ -119,6 +121,7 @@ static struct GPUShadersGlobal {
GPUShader *point_varying_size_varying_color_2D;
GPUShader *point_uniform_size_uniform_color_smooth_2D;
GPUShader *point_uniform_size_uniform_color_outline_smooth_2D;
GPUShader *point_uniform_size_varying_color_outline_smooth_2D;
GPUShader *point_fixed_size_uniform_color_3D;
GPUShader *point_fixed_size_varying_color_3D;
GPUShader *point_varying_size_uniform_color_3D;
@@ -676,7 +679,7 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
case GPU_SHADER_2D_UNIFORM_COLOR:
if (!GG.shaders.uniform_color_2D)
GG.shaders.uniform_color_2D = GPU_shader_create(
datatoc_gpu_shader_2D_no_color_vert_glsl,
datatoc_gpu_shader_2D_vert_glsl,
datatoc_gpu_shader_uniform_color_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.uniform_color_2D;
@@ -700,7 +703,7 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
case GPU_SHADER_3D_UNIFORM_COLOR:
if (!GG.shaders.uniform_color_3D)
GG.shaders.uniform_color_3D = GPU_shader_create(
datatoc_gpu_shader_3D_no_color_vert_glsl,
datatoc_gpu_shader_3D_vert_glsl,
datatoc_gpu_shader_uniform_color_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.uniform_color_3D;
@@ -724,7 +727,7 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
case GPU_SHADER_3D_DEPTH_ONLY:
if (!GG.shaders.depth_only_3D)
GG.shaders.depth_only_3D = GPU_shader_create(
datatoc_gpu_shader_3D_no_color_vert_glsl,
datatoc_gpu_shader_3D_vert_glsl,
datatoc_gpu_shader_depth_only_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.depth_only_3D;
@@ -732,7 +735,7 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
case GPU_SHADER_2D_POINT_FIXED_SIZE_UNIFORM_COLOR:
if (!GG.shaders.point_fixed_size_uniform_color_2D)
GG.shaders.point_fixed_size_uniform_color_2D = GPU_shader_create(
datatoc_gpu_shader_2D_no_color_vert_glsl,
datatoc_gpu_shader_2D_vert_glsl,
datatoc_gpu_shader_point_uniform_color_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.point_fixed_size_uniform_color_2D;
@@ -748,7 +751,7 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
case GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_SMOOTH:
if (!GG.shaders.point_uniform_size_uniform_color_smooth_2D)
GG.shaders.point_uniform_size_uniform_color_smooth_2D = GPU_shader_create(
datatoc_gpu_shader_2D_point_uniform_size_uniform_color_smooth_vert_glsl,
datatoc_gpu_shader_2D_point_uniform_size_smooth_vert_glsl,
datatoc_gpu_shader_point_uniform_color_smooth_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.point_uniform_size_uniform_color_smooth_2D;
@@ -756,15 +759,23 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
case GPU_SHADER_2D_POINT_UNIFORM_SIZE_UNIFORM_COLOR_OUTLINE_SMOOTH:
if (!GG.shaders.point_uniform_size_uniform_color_outline_smooth_2D)
GG.shaders.point_uniform_size_uniform_color_outline_smooth_2D = GPU_shader_create(
datatoc_gpu_shader_2D_point_uniform_size_uniform_color_outline_smooth_vert_glsl,
datatoc_gpu_shader_2D_point_uniform_size_outline_smooth_vert_glsl,
datatoc_gpu_shader_point_uniform_color_outline_smooth_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.point_uniform_size_uniform_color_outline_smooth_2D;
break;
case GPU_SHADER_2D_POINT_UNIFORM_SIZE_VARYING_COLOR_OUTLINE_SMOOTH:
if (!GG.shaders.point_uniform_size_varying_color_outline_smooth_2D)
GG.shaders.point_uniform_size_varying_color_outline_smooth_2D = GPU_shader_create(
datatoc_gpu_shader_2D_point_uniform_size_varying_color_outline_smooth_vert_glsl,
datatoc_gpu_shader_point_varying_color_outline_smooth_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.point_uniform_size_varying_color_outline_smooth_2D;
break;
case GPU_SHADER_3D_POINT_FIXED_SIZE_UNIFORM_COLOR:
if (!GG.shaders.point_fixed_size_uniform_color_3D)
GG.shaders.point_fixed_size_uniform_color_3D = GPU_shader_create(
datatoc_gpu_shader_3D_no_color_vert_glsl,
datatoc_gpu_shader_3D_vert_glsl,
datatoc_gpu_shader_point_uniform_color_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.point_fixed_size_uniform_color_3D;
@@ -780,7 +791,7 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
case GPU_SHADER_3D_POINT_VARYING_SIZE_UNIFORM_COLOR:
if (!GG.shaders.point_varying_size_uniform_color_3D)
GG.shaders.point_varying_size_uniform_color_3D = GPU_shader_create(
datatoc_gpu_shader_3D_point_varying_size_no_color_vert_glsl,
datatoc_gpu_shader_3D_point_varying_size_vert_glsl,
datatoc_gpu_shader_point_uniform_color_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.point_varying_size_uniform_color_3D;
@@ -967,6 +978,11 @@ void GPU_shader_free_builtin_shaders(void)
GG.shaders.point_uniform_size_uniform_color_outline_smooth_2D = NULL;
}
if (GG.shaders.point_uniform_size_varying_color_outline_smooth_2D) {
GPU_shader_free(GG.shaders.point_uniform_size_varying_color_outline_smooth_2D);
GG.shaders.point_uniform_size_varying_color_outline_smooth_2D = NULL;
}
if (GG.shaders.point_fixed_size_uniform_color_3D) {
GPU_shader_free(GG.shaders.point_fixed_size_uniform_color_3D);
GG.shaders.point_fixed_size_uniform_color_3D = NULL;

View File

@@ -0,0 +1,34 @@
uniform mat4 ModelViewProjectionMatrix;
uniform float size;
uniform float outlineWidth;
#if __VERSION__ == 120
attribute vec2 pos;
attribute vec4 color;
varying vec4 radii;
varying vec4 fillColor;
#else
in vec2 pos;
in vec4 color;
out vec4 radii;
out vec4 fillColor;
#endif
void main() {
gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
gl_PointSize = size;
fillColor = color;
// calculate concentric radii in pixels
float radius = 0.5 * size;
// start at the outside and progress toward the center
radii[0] = radius;
radii[1] = radius - 1.0;
radii[2] = radius - outlineWidth;
radii[3] = radius - outlineWidth - 1.0;
// convert to PointCoord units
radii /= size;
}

View File

@@ -0,0 +1,37 @@
uniform vec4 outlineColor;
#if __VERSION__ == 120
varying vec4 radii;
varying vec4 fillColor;
#define fragColor gl_FragColor
#else
in vec4 radii;
in vec4 fillColor;
out vec4 fragColor;
#endif
void main() {
float dist = length(gl_PointCoord - vec2(0.5));
// transparent outside of point
// --- 0 ---
// smooth transition
// --- 1 ---
// pure outline color
// --- 2 ---
// smooth transition
// --- 3 ---
// pure fill color
// ...
// dist = 0 at center of point
float midStroke = 0.5 * (radii[1] + radii[2]);
if (dist > midStroke) {
fragColor.rgb = outlineColor.rgb;
fragColor.a = mix(outlineColor.a, 0.0, smoothstep(radii[1], radii[0], dist));
}
else
fragColor = mix(fillColor, outlineColor, smoothstep(radii[3], radii[2], dist));
}