Use the new shader system for sprites.

This commit is contained in:
Bill Currie 2014-01-28 12:31:27 +09:00
parent 68bd7e643d
commit 50bb40be29
5 changed files with 88 additions and 75 deletions

View file

@ -5,12 +5,10 @@ AM_CPPFLAGS= -I$(top_srcdir)/include $(GLX_CFLAGS)
shader_src= quakeforge.glsl \ shader_src= quakeforge.glsl \
iqm.frag iqm.vert \ iqm.frag iqm.vert \
quake2d.frag quakeico.vert \ quake2d.frag quakeico.vert
quakespr.frag quakespr.vert
shader_gen= quakeforge.slc \ shader_gen= quakeforge.slc \
iqm.fc iqm.vc \ iqm.fc iqm.vc \
quake2d.fc quakeico.vc \ quake2d.fc quakeico.vc
quakespr.fc quakespr.vc
glsl_src = \ glsl_src = \
glsl_alias.c glsl_bsp.c glsl_draw.c glsl_fog.c glsl_iqm.c glsl_lightmap.c \ glsl_alias.c glsl_bsp.c glsl_draw.c glsl_fog.c glsl_iqm.c glsl_lightmap.c \

View file

@ -55,13 +55,17 @@
#include "r_internal.h" #include "r_internal.h"
static const char quakesprite_vert[] = static const char *sprite_vert_effects[] =
#include "quakespr.vc" {
; "QuakeForge.Vertex.sprite",
0
};
static const char quakesprite_frag[] = static const char *sprite_frag_effects[] =
#include "quakespr.fc" {
; "QuakeForge.Fragment.sprite",
0
};
//static float proj_matrix[16]; //static float proj_matrix[16];
@ -96,11 +100,14 @@ static struct {
void void
glsl_R_InitSprites (void) glsl_R_InitSprites (void)
{ {
shader_t *vert_shader, *frag_shader;
int frag, vert; int frag, vert;
vert = GLSL_CompileShaderS ("quakespr.vert", quakesprite_vert, vert_shader = GLSL_BuildShader (sprite_vert_effects);
frag_shader = GLSL_BuildShader (sprite_frag_effects);
vert = GLSL_CompileShader ("quakespr.vert", vert_shader,
GL_VERTEX_SHADER); GL_VERTEX_SHADER);
frag = GLSL_CompileShaderS ("quakespr.frag", quakesprite_frag, frag = GLSL_CompileShader ("quakespr.frag", frag_shader,
GL_FRAGMENT_SHADER); GL_FRAGMENT_SHADER);
quake_sprite.program = GLSL_LinkProgram ("quakespr", vert, frag); quake_sprite.program = GLSL_LinkProgram ("quakespr", vert, frag);
GLSL_ResolveShaderParam (quake_sprite.program, &quake_sprite.spritea); GLSL_ResolveShaderParam (quake_sprite.program, &quake_sprite.spritea);
@ -114,6 +121,8 @@ glsl_R_InitSprites (void)
GLSL_ResolveShaderParam (quake_sprite.program, &quake_sprite.uvab); GLSL_ResolveShaderParam (quake_sprite.program, &quake_sprite.uvab);
GLSL_ResolveShaderParam (quake_sprite.program, &quake_sprite.blend); GLSL_ResolveShaderParam (quake_sprite.program, &quake_sprite.blend);
GLSL_ResolveShaderParam (quake_sprite.program, &quake_sprite.fog); GLSL_ResolveShaderParam (quake_sprite.program, &quake_sprite.fog);
GLSL_FreeShader (vert_shader);
GLSL_FreeShader (frag_shader);
} }
static void static void

View file

@ -365,3 +365,72 @@ main (void)
{ {
gl_FragColor = fogBlend (texture2D (texture, st) * color); gl_FragColor = fogBlend (texture2D (texture, st) * color);
} }
-- Vertex.sprite
uniform mat4 mvp_mat;
attribute float vblend;
attribute vec4 vcolora, vcolorb;
attribute vec4 uvab; ///< ua va ub vb
attribute vec3 vertexa, vertexb;
varying float blend;
varying vec4 colora, colorb;
varying vec2 sta, stb;
void
main (void)
{
gl_Position = mvp_mat * vec4 (mix (vertexa, vertexb, vblend), 1.0);
blend = vblend;
colora = vcolora;
colorb = vcolorb;
sta = uvab.xy;
stb = uvab.zw;
}
-- Fragment.sprite
uniform sampler2D spritea;
uniform sampler2D spriteb;
uniform sampler2D palette;
uniform vec4 fog;
varying float blend;
varying vec4 colora, colorb;
varying vec2 sta, stb;
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)
{
float pixa, pixb;
vec4 cola, colb;
vec4 col;
pixa = texture2D (spritea, sta).r;
pixb = texture2D (spriteb, stb).r;
if (pixa == 1.0 && pixb == 1.0)
discard;
cola = texture2D (palette, vec2 (pixa, 0.0)) * colora;
colb = texture2D (palette, vec2 (pixb, 0.0)) * colorb;
col = mix (cola, colb, blend);
if (col.a == 0.0)
discard;
gl_FragColor = fogBlend (col);
}

View file

@ -1,43 +0,0 @@
uniform sampler2D spritea;
uniform sampler2D spriteb;
uniform sampler2D palette;
uniform vec4 fog;
varying float blend;
varying vec4 colora, colorb;
varying vec2 sta, stb;
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)
{
float pixa, pixb;
vec4 cola, colb;
vec4 col;
pixa = texture2D (spritea, sta).r;
pixb = texture2D (spriteb, stb).r;
if (pixa == 1.0 && pixb == 1.0)
discard;
cola = texture2D (palette, vec2 (pixa, 0.0)) * colora;
colb = texture2D (palette, vec2 (pixb, 0.0)) * colorb;
col = mix (cola, colb, blend);
if (col.a == 0.0)
discard;
gl_FragColor = fogBlend (col);
}

View file

@ -1,20 +0,0 @@
uniform mat4 mvp_mat;
attribute float vblend;
attribute vec4 vcolora, vcolorb;
attribute vec4 uvab; ///< ua va ub vb
attribute vec3 vertexa, vertexb;
varying float blend;
varying vec4 colora, colorb;
varying vec2 sta, stb;
void
main (void)
{
gl_Position = mvp_mat * vec4 (mix (vertexa, vertexb, vblend), 1.0);
blend = vblend;
colora = vcolora;
colorb = vcolorb;
sta = uvab.xy;
stb = uvab.zw;
}