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:
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
Reference in New Issue
Block a user