fb86222fc7
tweaked shadowmaps. now seems faster than stencil shadows. cubemap orientation should now match other engines. tweaked terrain. rtlights work. added pvs tests for embedded terrain. sections are now saved in chunks instead, which should mean windows doesn't have a panic attack at 16 million files in a single directory. hurrah. first pass at realigning menu options to cope with variable-width fonts. still need to do pure-text items. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4514 fc73d0e0-1445-4013-8a0c-d673dee63da5
147 lines
No EOL
3.7 KiB
GLSL
147 lines
No EOL
3.7 KiB
GLSL
!!permu FOG
|
|
#include "sys/fog.h"
|
|
varying vec2 tc;
|
|
varying vec2 lm;
|
|
varying vec4 vc;
|
|
|
|
#ifdef RTLIGHT
|
|
varying vec3 lightvector;
|
|
// #if defined(SPECULAR) || defined(OFFSETMAPPING)
|
|
// varying vec3 eyevector;
|
|
// #endif
|
|
#if defined(PCF) || defined(CUBE) || defined(SPOT)
|
|
varying vec4 vtexprojcoord;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef VERTEX_SHADER
|
|
|
|
#ifdef RTLIGHT
|
|
uniform vec3 l_lightposition;
|
|
// #if defined(SPECULAR) || defined(OFFSETMAPPING)
|
|
// uniform vec3 e_eyepos;
|
|
// #endif
|
|
#if defined(PCF) || defined(CUBE) || defined(SPOT)
|
|
uniform mat4 l_cubematrix;
|
|
#endif
|
|
attribute vec3 v_normal;
|
|
attribute vec3 v_svector;
|
|
attribute vec3 v_tvector;
|
|
#endif
|
|
|
|
attribute vec2 v_texcoord;
|
|
attribute vec2 v_lmcoord;
|
|
attribute vec4 v_colour;
|
|
|
|
void main (void)
|
|
{
|
|
tc = v_texcoord.st;
|
|
lm = v_lmcoord.st;
|
|
vc = v_colour;
|
|
gl_Position = ftetransform();
|
|
|
|
#ifdef RTLIGHT
|
|
//light position is in model space, which is handy.
|
|
vec3 lightminusvertex = l_lightposition - v_position.xyz;
|
|
|
|
//no bumpmapping, so we can just use distance without regard for actual surface direction. we still do scalecos stuff. you might notice it on steep slopes.
|
|
lightvector = lightminusvertex;
|
|
// lightvector.x = -dot(lightminusvertex, v_svector.xyz);
|
|
// lightvector.y = dot(lightminusvertex, v_tvector.xyz);
|
|
// lightvector.z = dot(lightminusvertex, v_normal.xyz);
|
|
|
|
// #if defined(SPECULAR)||defined(OFFSETMAPPING)
|
|
// vec3 eyeminusvertex = e_eyepos - v_position.xyz;
|
|
// eyevector.x = -dot(eyeminusvertex, v_svector.xyz);
|
|
// eyevector.y = dot(eyeminusvertex, v_tvector.xyz);
|
|
// eyevector.z = dot(eyeminusvertex, v_normal.xyz);
|
|
// #endif
|
|
#if defined(PCF) || defined(SPOT) || defined(CUBE)
|
|
//for texture projections/shadowmapping on dlights
|
|
vtexprojcoord = (l_cubematrix*vec4(v_position.xyz, 1.0));
|
|
#endif
|
|
#endif
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef FRAGMENT_SHADER
|
|
//four texture passes
|
|
uniform sampler2D s_t0;
|
|
uniform sampler2D s_t1;
|
|
uniform sampler2D s_t2;
|
|
uniform sampler2D s_t3;
|
|
|
|
//mix values
|
|
uniform sampler2D s_t4;
|
|
|
|
#ifdef PCF
|
|
sampler2DShadow s_t5;
|
|
#include "sys/pcf.h"
|
|
#endif
|
|
|
|
//light levels
|
|
uniform vec4 e_lmscale;
|
|
|
|
#ifdef RTLIGHT
|
|
uniform float l_lightradius;
|
|
uniform vec3 l_lightcolour;
|
|
uniform vec3 l_lightcolourscale;
|
|
#endif
|
|
|
|
void main (void)
|
|
{
|
|
vec4 r;
|
|
vec4 m = texture2D(s_t4, lm);
|
|
|
|
r = texture2D(s_t0, tc)*m.r;
|
|
r += texture2D(s_t1, tc)*m.g;
|
|
r += texture2D(s_t2, tc)*m.b;
|
|
r += texture2D(s_t3, tc)*(1.0 - (m.r + m.g + m.b));
|
|
|
|
//vertex colours provide a scaler that applies even through rtlights.
|
|
r *= vc;
|
|
|
|
#ifdef RTLIGHT
|
|
vec3 nl = normalize(lightvector);
|
|
float colorscale = max(1.0 - (dot(lightvector, lightvector)/(l_lightradius*l_lightradius)), 0.0);
|
|
vec3 diff;
|
|
// #ifdef BUMP
|
|
// colorscale *= (l_lightcolourscale.x + l_lightcolourscale.y * max(dot(bumps, nl), 0.0));
|
|
// #else
|
|
colorscale *= (l_lightcolourscale.x + l_lightcolourscale.y * max(dot(vec3(0.0, 0.0, 1.0), nl), 0.0));
|
|
// #endif
|
|
|
|
// #ifdef SPECULAR
|
|
// vec3 halfdir = normalize(normalize(eyevector) + nl);
|
|
// float spec = pow(max(dot(halfdir, bumps), 0.0), 32.0 * specs.a);
|
|
// diff += l_lightcolourscale.z * spec * specs.rgb;
|
|
// #endif
|
|
|
|
|
|
|
|
#if defined(SPOT)
|
|
if (vtexprojcoord.w < 0.0) discard;
|
|
vec2 spot = ((vtexprojcoord.st)/vtexprojcoord.w);
|
|
colorscale *= 1.0-(dot(spot,spot));
|
|
#endif
|
|
#ifdef PCF
|
|
colorscale *= ShadowmapFilter(s_t5);
|
|
#endif
|
|
|
|
r.rgb *= colorscale * l_lightcolour;
|
|
|
|
gl_FragColor = fog4additive(r);
|
|
#else
|
|
//lightmap is greyscale in m.a. probably we should just scale the texture mix, but precision errors when editing make me paranoid.
|
|
r *= e_lmscale*vec4(m.aaa,1.0);
|
|
gl_FragColor = fog4(r);
|
|
#endif
|
|
}
|
|
#endif |