mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-05-31 00:30:57 +00:00
Use the new shader system for sprites.
This commit is contained in:
parent
68bd7e643d
commit
50bb40be29
5 changed files with 88 additions and 75 deletions
|
@ -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 \
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
|
@ -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;
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue