Use the new shader system for textured particles.

This commit is contained in:
Bill Currie 2014-01-28 12:16:52 +09:00
parent 1a7b532927
commit 1d67f8f0c3
5 changed files with 71 additions and 59 deletions

View file

@ -6,13 +6,11 @@ AM_CPPFLAGS= -I$(top_srcdir)/include $(GLX_CFLAGS)
shader_src= quakeforge.glsl \
iqm.frag iqm.vert \
quake2d.frag quakeico.vert \
quakepar.frag quakepar.vert \
quakespr.frag quakespr.vert \
quaketxt.vert
shader_gen= quakeforge.slc \
iqm.fc iqm.vc \
quake2d.fc quakeico.vc \
quakepar.fc quakepar.vc \
quakespr.fc quakespr.vc quaketxt.vc
glsl_src = \

View file

@ -90,13 +90,17 @@ static const char *particle_point_frag_effects[] =
0
};
static const char quakepart_vert[] =
#include "quakepar.vc"
;
static const char *particle_textured_vert_effects[] =
{
"QuakeForge.Vertex.particle.textured",
0
};
static const char quakepart_frag[] =
#include "quakepar.fc"
;
static const char *particle_textured_frag_effects[] =
{
"QuakeForge.Fragment.particle.textured",
0
};
static struct {
int program;
@ -243,9 +247,11 @@ glsl_R_InitParticles (void)
GLSL_FreeShader (vert_shader);
GLSL_FreeShader (frag_shader);
vert = GLSL_CompileShaderS ("quakepar.vert", quakepart_vert,
vert_shader = GLSL_BuildShader (particle_textured_vert_effects);
frag_shader = GLSL_BuildShader (particle_textured_frag_effects);
vert = GLSL_CompileShader ("quakepar.vert", vert_shader,
GL_VERTEX_SHADER);
frag = GLSL_CompileShaderS ("quakepar.frag", quakepart_frag,
frag = GLSL_CompileShader ("quakepar.frag", frag_shader,
GL_FRAGMENT_SHADER);
quake_part.program = GLSL_LinkProgram ("quakepart", vert, frag);
GLSL_ResolveShaderParam (quake_part.program, &quake_part.mvp_matrix);
@ -254,6 +260,8 @@ glsl_R_InitParticles (void)
GLSL_ResolveShaderParam (quake_part.program, &quake_part.color);
GLSL_ResolveShaderParam (quake_part.program, &quake_part.texture);
GLSL_ResolveShaderParam (quake_part.program, &quake_part.fog);
GLSL_FreeShader (vert_shader);
GLSL_FreeShader (frag_shader);
memset (data, 0, sizeof (data));
qfeglGenTextures (1, &part_tex);

View file

@ -279,6 +279,30 @@ main (void)
color = vcolor;
}
-- Vertex.particle.textured
uniform mat4 mvp_mat;
attribute vec4 vcolor;
attribute vec2 vst;
/** Vertex position.
x, y, z, c
c is the color of the point.
*/
attribute vec3 vertex;
varying vec4 color;
varying vec2 st;
void
main (void)
{
gl_Position = mvp_mat * vec4 (vertex, 1.0);
color = vcolor;
st = vst;
}
-- Fragment.particle.point
//precision mediump float;
@ -310,3 +334,34 @@ main (void)
discard;
gl_FragColor = fogBlend (texture2D (palette, vec2 (color, 0.0)));
}
-- Fragment.particle.textured
//precision mediump float;
uniform sampler2D texture;
uniform vec4 fog;
varying vec4 color;
varying vec2 st;
float
sqr (float x)
{
return x * x;
}
vec4
fogBlend (vec4 color)
{
float f;
vec4 fog_color = vec4 (fog.rgb, 1.0);
f = exp (-sqr (fog.a * gl_FragCoord.z / gl_FragCoord.w));
return vec4 (mix (fog_color.rgb, color.rgb, f), color.a);
}
void
main (void)
{
gl_FragColor = fogBlend (texture2D (texture, st) * color);
}

View file

@ -1,28 +0,0 @@
//precision mediump float;
uniform sampler2D texture;
uniform vec4 fog;
varying vec4 color;
varying vec2 st;
float
sqr (float x)
{
return x * x;
}
vec4
fogBlend (vec4 color)
{
float f;
vec4 fog_color = vec4 (fog.rgb, 1.0);
f = exp (-sqr (fog.a * gl_FragCoord.z / gl_FragCoord.w));
return vec4 (mix (fog_color.rgb, color.rgb, f), color.a);
}
void
main (void)
{
gl_FragColor = fogBlend (texture2D (texture, st) * color);
}

View file

@ -1,21 +0,0 @@
uniform mat4 mvp_mat;
attribute vec4 vcolor;
attribute vec2 vst;
/** Vertex position.
x, y, z, c
c is the color of the point.
*/
attribute vec3 vertex;
varying vec4 color;
varying vec2 st;
void
main (void)
{
gl_Position = mvp_mat * vec4 (vertex, 1.0);
color = vcolor;
st = vst;
}