Create some shaders for quake text.

Still nothing drawn, but this gets my shader scripts into C without me
having to look at ugly strings.
This commit is contained in:
Bill Currie 2011-12-25 15:53:12 +09:00
parent b7c90fa02d
commit 9df7370bcd
4 changed files with 72 additions and 1 deletions

View file

@ -2,16 +2,26 @@ AUTOMAKE_OPTIONS= foreign
AM_CFLAGS= @PREFER_PIC@
INCLUDES= -I$(top_srcdir)/include $(GLX_CFLAGS)
shader_src= quaketxt.frag quaketxt.vert
shader_gen= quaketxt.fc quaketxt.vc
if BUILD_GL
noinst_LTLIBRARIES= libglsl.la
BUILT_SOURCES= $(shader_gen)
else
noinst_LTLIBRARIES=
BUILT_SOURCES=
endif
SUFFICES=.frag .vert .fc .vc
.frag.fc:
sed -e 's/^/"/' -e 's/$$/\\n"/' $< > $@
.vert.vc:
sed -e 's/^/"/' -e 's/$$/\\n"/' $< > $@
glsl_src = \
glsl_draw.c glsl_main.c
libglsl_la_SOURCES= $(glsl_src)
EXTRA_DIST = $(glsl_src)
EXTRA_DIST = $(glsl_src) $(shader_src)

View file

@ -35,6 +35,14 @@ static __attribute__ ((used)) const char rcsid[] = "$Id$";
#include "QF/draw.h"
static const char quaketext_vert[] =
#include "quaketxt.vc"
;
static const char quaketext_frag[] =
#include "quaketxt.fc"
;
VISIBLE byte *draw_chars;
VISIBLE qpic_t *

View file

@ -0,0 +1,13 @@
precision mediump float;
uniform sampler2D charmap;
uniform sampler2D palette;
varying sv;
void
main (void)
{
int pix;
pix = texture2D (charmap, sv, 0);
gl_FragColor = texture2D (palette, vec2 (pix, 0.5), 0);
}

View file

@ -0,0 +1,40 @@
/** Vertex position.
x, y, cx, cy
\a vertex provides the onscreen location at which to draw the character
(\a x, \a y) and which corner of the character cell this vertex
represents (\a cx, \a cy). \a cx and \a cy must be either 0 or 1, or
wierd things will happen with the character cell.
*/
attribute vec4 vertex;
/** The character to draw.
The quake character map supports only 256 characters, 0-255. Any other
value will give interesting results.
*/
attribute int char;
/** Coordinate in character map texture.
*/
varying vec2 st;
void
main (void)
{
int row, col;
vec2 pos, corner, uv;
const vec2 inset = (0.25, 0.25);
const vec2 size = (0.0625, 0.0625);
row = floor (char / 16);
col = mod (char, 16);
pos = vertex.xy;
corner = vertex.zw;
uv = vec2 (row, col) + inset * (1 - 2 * corner) + 8 * corner;
uv *= size;
gl_Position = mvp_mat * vec4 (pos + corner * 8, 0, 1);
st = uv + corner
}