OpenGL: shaders for simple 3D drawing

These are intended for very simple drawing. No lighting etc.

Shares some fragment code with the 2D shaders.

Similar to their 2D counterparts, but are not combined because of
future plans for separate 2D & 3D matrix stacks.
This commit is contained in:
Mike Erwin 2016-08-16 14:58:53 -04:00
parent 8619e09107
commit b8f27b2514
9 changed files with 123 additions and 8 deletions

View File

@ -100,12 +100,16 @@ set(SRC
intern/gpu_private.h
)
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_uniform_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_uniform_color_frag.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_flat_color_vert.glsl SRC)
data_to_c_simple(shaders/gpu_shader_2D_flat_color_frag.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_3D_uniform_color_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)
data_to_c_simple(shaders/gpu_shader_geometry.glsl SRC)
data_to_c_simple(shaders/gpu_shader_smoke_frag.glsl SRC)

View File

@ -90,10 +90,14 @@ typedef enum GPUBuiltinShader {
GPU_SHADER_SMOKE = 2,
GPU_SHADER_SMOKE_FIRE = 3,
/* for simple drawing */
/* for simple 2D drawing */
GPU_SHADER_2D_UNIFORM_COLOR,
GPU_SHADER_2D_FLAT_COLOR,
GPU_SHADER_2D_SMOOTH_COLOR,
/* for simple 3D drawing */
GPU_SHADER_3D_UNIFORM_COLOR,
GPU_SHADER_3D_FLAT_COLOR,
GPU_SHADER_3D_SMOOTH_COLOR,
} GPUBuiltinShader;
GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader);

View File

@ -46,12 +46,16 @@
#define MAX_EXT_DEFINE_LENGTH 1024
/* Non-generated shaders */
extern char datatoc_gpu_shader_uniform_color_frag_glsl[];
extern char datatoc_gpu_shader_flat_color_frag_glsl[];
extern char datatoc_gpu_shader_2D_uniform_color_vert_glsl[];
extern char datatoc_gpu_shader_2D_uniform_color_frag_glsl[];
extern char datatoc_gpu_shader_2D_flat_color_vert_glsl[];
extern char datatoc_gpu_shader_2D_flat_color_frag_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_3D_uniform_color_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[];
extern char datatoc_gpu_shader_smoke_vert_glsl[];
extern char datatoc_gpu_shader_smoke_frag_glsl[];
@ -77,10 +81,14 @@ static struct GPUShadersGlobal {
GPUShader *smoke_fire;
/* cache for shader fx. Those can exist in combinations so store them here */
GPUShader *fx_shaders[MAX_FX_SHADERS * 2];
/* for simple drawing */
/* for simple 2D drawing */
GPUShader *uniform_color_2D;
GPUShader *flat_color_2D;
GPUShader *smooth_color_2D;
/* for simple 3D drawing */
GPUShader *uniform_color_3D;
GPUShader *flat_color_3D;
GPUShader *smooth_color_3D;
} shaders;
} GG = {{NULL}};
@ -637,7 +645,7 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
if (!GG.shaders.uniform_color_2D)
GG.shaders.uniform_color_2D = GPU_shader_create(
datatoc_gpu_shader_2D_uniform_color_vert_glsl,
datatoc_gpu_shader_2D_uniform_color_frag_glsl,
datatoc_gpu_shader_uniform_color_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.uniform_color_2D;
break;
@ -645,7 +653,7 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
if (!GG.shaders.flat_color_2D)
GG.shaders.flat_color_2D = GPU_shader_create(
datatoc_gpu_shader_2D_flat_color_vert_glsl,
datatoc_gpu_shader_2D_flat_color_frag_glsl,
datatoc_gpu_shader_flat_color_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.flat_color_2D;
break;
@ -657,6 +665,30 @@ GPUShader *GPU_shader_get_builtin_shader(GPUBuiltinShader shader)
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.smooth_color_2D;
break;
case GPU_SHADER_3D_UNIFORM_COLOR:
if (!GG.shaders.uniform_color_3D)
GG.shaders.uniform_color_3D = GPU_shader_create(
datatoc_gpu_shader_3D_uniform_color_vert_glsl,
datatoc_gpu_shader_uniform_color_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.uniform_color_3D;
break;
case GPU_SHADER_3D_FLAT_COLOR:
if (!GG.shaders.flat_color_3D)
GG.shaders.flat_color_3D = GPU_shader_create(
datatoc_gpu_shader_3D_flat_color_vert_glsl,
datatoc_gpu_shader_flat_color_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.flat_color_3D;
break;
case GPU_SHADER_3D_SMOOTH_COLOR:
if (!GG.shaders.smooth_color_3D)
GG.shaders.smooth_color_3D = GPU_shader_create(
datatoc_gpu_shader_3D_smooth_color_vert_glsl,
datatoc_gpu_shader_3D_smooth_color_frag_glsl,
NULL, NULL, NULL, 0, 0, 0);
retval = GG.shaders.smooth_color_3D;
break;
}
if (retval == NULL)
@ -783,6 +815,21 @@ void GPU_shader_free_builtin_shaders(void)
GG.shaders.smooth_color_2D = NULL;
}
if (GG.shaders.uniform_color_3D) {
GPU_shader_free(GG.shaders.uniform_color_3D);
GG.shaders.uniform_color_3D = NULL;
}
if (GG.shaders.flat_color_3D) {
GPU_shader_free(GG.shaders.flat_color_3D);
GG.shaders.flat_color_3D = NULL;
}
if (GG.shaders.smooth_color_3D) {
GPU_shader_free(GG.shaders.smooth_color_3D);
GG.shaders.smooth_color_3D = NULL;
}
for (i = 0; i < 2 * MAX_FX_SHADERS; ++i) {
if (GG.shaders.fx_shaders[i]) {
GPU_shader_free(GG.shaders.fx_shaders[i]);

View File

@ -0,0 +1,18 @@
#if __VERSION__ == 120
attribute vec3 pos;
attribute vec4 color;
flat varying vec4 finalColor;
#else
in vec3 pos;
in vec4 color;
flat out vec4 finalColor;
#endif
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * vec4(pos, 1.0);
finalColor = color;
}

View File

@ -0,0 +1,13 @@
#if __VERSION__ == 120
varying vec4 finalColor;
#define fragColor gl_FragColor
#else
in vec4 finalColor;
out vec4 fragColor;
#endif
void main()
{
fragColor = finalColor;
}

View File

@ -0,0 +1,18 @@
#if __VERSION__ == 120
attribute vec3 pos;
attribute vec4 color;
varying vec4 finalColor;
#else
in vec2 pos;
in vec4 color;
out vec4 finalColor;
#endif
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * vec4(pos, 1.0);
finalColor = color;
}

View File

@ -0,0 +1,11 @@
#if __VERSION__ == 120
attribute vec3 pos;
#else
in vec3 pos;
#endif
void main()
{
gl_Position = gl_ModelViewProjectionMatrix * vec4(pos, 1.0);
}