Platform: GLSL improvements, introduction of r_skipDiffuse, r_skipNormal

and r_skipSpecular
This commit is contained in:
Marco Cawthorne 2020-10-27 05:41:11 +01:00
parent 624a68bf7f
commit 185c7de151
18 changed files with 476 additions and 374 deletions

View file

@ -21,8 +21,8 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipdiffuse !!cvardf r_skipDiffuse
!!cvardf dev_skipnormal !!cvardf r_skipNormal
#include "sys/defs.h" #include "sys/defs.h"
@ -80,6 +80,7 @@ varying vec2 lm1, lm2, lm3;
return lightmaps; return lightmaps;
} }
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f) vec3 lightmap_fragment(vec3 normal_f)
{ {
#ifndef DELUXE #ifndef DELUXE
@ -99,29 +100,28 @@ varying vec2 lm1, lm2, lm3;
return lightmaps; return lightmaps;
#endif #endif
} }
#endif
void main (void) void main (void)
{ {
vec4 diffuse_f; vec4 diffuse_f;
vec3 normal_f;
normal_f = normalize(texture2D(s_t1, tex_c).rgb - 0.5); #if r_skipDiffuse==0
diffuse_f = texture2D(s_t0, tex_c);
if (float(dev_skipdiffuse) == 1.0) { #else
diffuse_f = vec4(1.0,1.0,1.0,1.0); diffuse_f = vec4(1.0,1.0,1.0,1.0);
} else { #endif
diffuse_f = texture2D(s_t0, tex_c);
}
#ifdef FAKESHADOWS #ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif #endif
if (float(dev_skipnormal) == 1.0) { #if r_skipNormal==0
diffuse_f.rgb *= lightmap_fragment(); vec3 normal_f = normalize(texture2D(s_t1, tex_c).rgb - 0.5);
} else { diffuse_f.rgb *= lightmap_fragment(normal_f);
diffuse_f.rgb *= lightmap_fragment(normal_f); #else
} diffuse_f.rgb *= lightmap_fragment();
#endif
gl_FragColor = fog4(diffuse_f); gl_FragColor = fog4(diffuse_f);
} }

View file

@ -15,7 +15,8 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipnormal !!cvardf r_skipDiffuse
!!cvardf r_skipNormal
#include "sys/defs.h" #include "sys/defs.h"
@ -72,26 +73,42 @@ varying vec2 lm1, lm2, lm3;
return lightmaps; return lightmaps;
} }
vec3 lightmap_fragment (vec3 normal_f) #if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{ {
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps; vec3 lightmaps;
#ifdef LIGHTSTYLED #if defined(LIGHTSTYLED)
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else #else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif #endif
return lightmaps; return lightmaps;
#endif
} }
#endif
void main (void) void main (void)
{ {
#if r_skipDiffuse==0
vec4 diffuse_f = texture2D(s_diffuse, tex_c); vec4 diffuse_f = texture2D(s_diffuse, tex_c);
#else
vec4 diffuse_f = vec4(1.0,1.0,1.0,1.0);
#endif
#if r_skipNormal==1
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
#else
#define normal_f vec3(0.0,0.0,1.0)
#endif
if (diffuse_f.a < 0.5) { if (diffuse_f.a < 0.5) {
discard; discard;
} }
@ -100,11 +117,11 @@ varying vec2 lm1, lm2, lm3;
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif #endif
if (float(dev_skipnormal) == 1.0) { #if r_skipNormal==1
diffuse_f.rgb *= lightmap_fragment(); diffuse_f.rgb *= lightmap_fragment();
} else { #else
diffuse_f.rgb *= lightmap_fragment(normal_f); diffuse_f.rgb *= lightmap_fragment(normal_f);
} #endif
gl_FragColor = fog4(diffuse_f); gl_FragColor = fog4(diffuse_f);
} }

View file

@ -16,6 +16,8 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf r_skipSpecular
#include "sys/defs.h" #include "sys/defs.h"
varying vec2 tex_c; varying vec2 tex_c;
@ -80,33 +82,44 @@ varying vec2 lm1, lm2, lm3;
return lightmaps; return lightmaps;
} }
vec3 lightmap_fragment (vec3 normal_f) #if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{ {
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps; vec3 lightmaps;
#ifdef LIGHTSTYLED #if defined(LIGHTSTYLED)
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else #else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif #endif
return lightmaps; return lightmaps;
#endif
} }
#endif
void main (void) void main (void)
{ {
vec2 stc; vec2 stc;
vec4 diffuse_f = texture2D(s_diffuse, tex_c); vec4 diffuse_f = texture2D(s_diffuse, tex_c);
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
/* modulate the final pixel with the lightmap value */ #if r_skipNormal==1
if (float(dev_skipnormal) == 1.0) { vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
diffuse_f.rgb *= lightmap_fragment(); #else
} else { #define normal_f vec3(0.0,0.0,0.5)
diffuse_f.rgb *= lightmap_fragment(normal_f); #endif
}
#if r_skipNormal==1
diffuse_f.rgb *= lightmap_fragment();
#else
diffuse_f.rgb *= lightmap_fragment(normal_f);
#endif
/* map the reflection buffer onto the surface */ /* map the reflection buffer onto the surface */
stc = (1.0 + (tf.xy / tf.w)) * 0.5; stc = (1.0 + (tf.xy / tf.w)) * 0.5;
@ -115,9 +128,9 @@ varying vec2 lm1, lm2, lm3;
diffuse_f.rgb = mix(texture2D(s_reflection, stc).rgb, diffuse_f.rgb, diffuse_f.a); diffuse_f.rgb = mix(texture2D(s_reflection, stc).rgb, diffuse_f.rgb, diffuse_f.a);
diffuse_f.a = 1.0; diffuse_f.a = 1.0;
#ifdef FAKESHADOWS #ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif #endif
gl_FragColor = fog4(diffuse_f); gl_FragColor = fog4(diffuse_f);
} }

View file

@ -16,7 +16,9 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipnormal !!cvardf r_skipDiffuse
!!cvardf r_skipNormal
!!cvardf r_skipSpecular
#include "sys/defs.h" #include "sys/defs.h"
@ -84,46 +86,69 @@ varying vec2 lm1, lm2, lm3;
return lightmaps; return lightmaps;
} }
vec3 lightmap_fragment (vec3 normal_f) #if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{ {
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps; vec3 lightmaps;
#ifdef LIGHTSTYLED #if defined(LIGHTSTYLED)
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else #else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif #endif
return lightmaps; return lightmaps;
#endif
} }
#endif
void main (void) void main (void)
{ {
vec3 cube_c; vec3 cube_c;
vec4 out_f = vec4(1.0, 1.0, 1.0, 1.0);
vec4 diffuse_f = texture2D(s_t0, tex_c);
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
vec3 env_f; vec3 env_f;
if (float(dev_skipnormal) == 1.0) { #if r_skipDiffuse==0
diffuse_f.rgb *= lightmap_fragment(); vec4 diffuse_f = texture2D(s_diffuse, tex_c);
} else { #else
diffuse_f.rgb *= lightmap_fragment(normal_f); vec4 diffuse_f = vec4(1.0,1.0,1.0,1.0);
} #endif
#if r_skipNormal==0
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
#define refl diffuse_f.a
#else
#define normal_f vec3(0.0,0.0,1.0)
#define refl (diffuse_f.a / 2.0) + 0.5
#endif
#if r_skipNormal==1
diffuse_f.rgb *= lightmap_fragment();
#else
diffuse_f.rgb *= lightmap_fragment(normal_f);
#endif
#ifdef FAKESHADOWS #ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif #endif
#if r_skipSpecular==0
vec4 out_f = vec4(1.0, 1.0, 1.0, 1.0);
cube_c = reflect(normalize(-eyevector), normal_f.rgb); cube_c = reflect(normalize(-eyevector), normal_f.rgb);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz; cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
env_f = textureCube(s_box, cube_c).rgb * (e_lmscale.rgb * 0.25); env_f = textureCube(s_box, cube_c).rgb * (e_lmscale.rgb * 0.25);
out_f.rgb = mix(env_f, diffuse_f.rgb, diffuse_f.a); out_f.rgb = mix(env_f, diffuse_f.rgb, refl);
// Add fog to the final fragment // Add fog to the final fragment
gl_FragColor = fog4(out_f); gl_FragColor = fog4(out_f);
#else
gl_FragColor = fog4(diffuse_f);;
#endif
} }
#endif #endif

View file

@ -16,7 +16,8 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipnormal !!cvardf r_skipNormal
!!cvardf r_skipSpecular
#include "sys/defs.h" #include "sys/defs.h"
@ -80,28 +81,45 @@ varying vec2 lm1, lm2, lm3;
return lightmaps; return lightmaps;
} }
vec3 lightmap_fragment (vec3 normal_f) #if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{ {
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps; vec3 lightmaps;
#ifdef LIGHTSTYLED #if defined(LIGHTSTYLED)
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else #else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif #endif
return lightmaps; return lightmaps;
#endif
} }
#endif
void main (void) void main (void)
{ {
vec4 diffuse_f = texture2D(s_diffuse, tex_c);
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
float gloss = texture2D(s_normalmap, tex_c).a * 0.1; float gloss = texture2D(s_normalmap, tex_c).a * 0.1;
float spec; float spec;
#if r_skipDiffuse==0
vec4 diffuse_f = texture2D(s_diffuse, tex_c);
#else
#define diffuse_f vec4(1.0, 1.0, 1.0, 1.0)
#endif
#if r_skipNormals==1
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
#else
#define normal_f vec3(0.0,0.0,0.5)
#endif
if (diffuse_f.a < 0.5) { if (diffuse_f.a < 0.5) {
discard; discard;
} }
@ -110,16 +128,18 @@ varying vec2 lm1, lm2, lm3;
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif #endif
if (float(dev_skipnormal) == 1.0) { #if r_skipNormal==1
diffuse_f.rgb *= lightmap_fragment(); diffuse_f.rgb *= lightmap_fragment();
} else { #else
diffuse_f.rgb *= lightmap_fragment(normal_f); diffuse_f.rgb *= lightmap_fragment(normal_f);
} #endif
#if r_skipSpecular==0
vec3 halfdir = normalize(normalize(eyevector) - e_light_dir); vec3 halfdir = normalize(normalize(eyevector) - e_light_dir);
spec = pow(max(dot(halfdir, normal_f), 0.0), FTE_SPECULAR_EXPONENT); spec = pow(max(dot(halfdir, normal_f), 0.0), FTE_SPECULAR_EXPONENT);
spec *= 0.05; spec *= 0.05;
diffuse_f.rgb += spec; diffuse_f.rgb += spec;
#endif
gl_FragColor = fog4(diffuse_f); gl_FragColor = fog4(diffuse_f);
} }

View file

@ -14,10 +14,11 @@
!!permu FAKESHADOWS !!permu FAKESHADOWS
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!cvardf r_skipDiffuse
!!cvardf r_skipNormal
!!cvardf r_skipSpecular
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipnormal
#include "sys/defs.h" #include "sys/defs.h"
varying vec2 tex_c; varying vec2 tex_c;
@ -80,27 +81,42 @@ varying vec2 lm1, lm2, lm3;
return lightmaps; return lightmaps;
} }
vec3 lightmap_fragment (vec3 normal_f) #if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{ {
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps; vec3 lightmaps;
#ifdef LIGHTSTYLED #if defined(LIGHTSTYLED)
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else #else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif #endif
return lightmaps; return lightmaps;
#endif
} }
#endif
void main (void) void main (void)
{ {
#if r_skipDiffuse==0
vec4 diffuse_f = texture2D(s_diffuse, tex_c); vec4 diffuse_f = texture2D(s_diffuse, tex_c);
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); #else
float gloss = texture2D(s_normalmap, tex_c).a * 0.1; vec4 diffuse_f = vec4(1.0,1.0,1.0,1.0);
#endif
#if r_skipNormal==1
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
#else
#define normal_f vec3(0.0,0.0,0.5)
#endif
if (diffuse_f.a < 0.5) { if (diffuse_f.a < 0.5) {
discard; discard;
} }
@ -109,18 +125,19 @@ varying vec2 lm1, lm2, lm3;
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif #endif
/* lightmap */ #if r_skipNormal==1
if (float(dev_skipnormal) == 1.0) { diffuse_f.rgb *= lightmap_fragment();
diffuse_f.rgb *= lightmap_fragment(); #else
} else { diffuse_f.rgb *= lightmap_fragment(normal_f);
diffuse_f.rgb *= lightmap_fragment(normal_f); #endif
}
/* specular */ #if r_skipSpecular==0
float gloss = texture2D(s_normalmap, tex_c).a * 0.1;
vec3 halfdir = normalize(normalize(eyevector) - e_light_dir); vec3 halfdir = normalize(normalize(eyevector) - e_light_dir);
float spec = pow(max(dot(halfdir, normal_f), 0.0), FTE_SPECULAR_EXPONENT); float spec = pow(max(dot(halfdir, normal_f), 0.0), FTE_SPECULAR_EXPONENT);
spec *= gloss; spec *= gloss;
diffuse_f.rgb += spec; diffuse_f.rgb += spec;
#endif
gl_FragColor = fog4(diffuse_f); gl_FragColor = fog4(diffuse_f);
} }

View file

@ -16,7 +16,8 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipnormal !!cvardf r_skipNormal
!!cvardf r_skipSpecular
#include "sys/defs.h" #include "sys/defs.h"
@ -37,11 +38,11 @@ varying vec4 vtexprojcoord;
void lightmapped_init(void) void lightmapped_init(void)
{ {
lm0 = v_lmcoord; lm0 = v_lmcoord;
#ifdef LIGHTSTYLED #ifdef LIGHTSTYLED
lm1 = v_lmcoord2; lm1 = v_lmcoord2;
lm2 = v_lmcoord3; lm2 = v_lmcoord3;
lm3 = v_lmcoord4; lm3 = v_lmcoord4;
#endif #endif
} }
void main (void) void main (void)
@ -84,27 +85,45 @@ varying vec4 vtexprojcoord;
return lightmaps; return lightmaps;
} }
vec3 lightmap_fragment (vec3 normal_f) #if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{ {
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps; vec3 lightmaps;
#ifdef LIGHTSTYLED #if defined(LIGHTSTYLED)
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else #else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif #endif
return lightmaps; return lightmaps;
#endif
} }
#endif
void main (void) void main (void)
{ {
vec3 cube_c; vec3 cube_c;
vec4 out_f = vec4(1.0, 1.0, 1.0, 1.0); vec4 out_f = vec4(1.0, 1.0, 1.0, 1.0);
#if r_skipDiffuse==0
vec4 diffuse_f = texture2D(s_diffuse, tex_c); vec4 diffuse_f = texture2D(s_diffuse, tex_c);
#else
#define diffuse_f vec4(1.0, 1.0, 1.0, 1.0)
#endif
#if r_skipNormal==1
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
#else
#define normal_f vec3(0.0,0.0,0.5)
#endif
float gloss = texture2D(s_normalmap, tex_c).a; float gloss = texture2D(s_normalmap, tex_c).a;
float spec; float spec;
@ -112,20 +131,23 @@ varying vec4 vtexprojcoord;
spec = pow(max(dot(halfdir, normal_f), 0.0), FTE_SPECULAR_EXPONENT); spec = pow(max(dot(halfdir, normal_f), 0.0), FTE_SPECULAR_EXPONENT);
spec *= (gloss * 0.1); spec *= (gloss * 0.1);
if (float(dev_skipnormal) == 1.0) { #if r_skipNormal==1
diffuse_f.rgb *= lightmap_fragment(); diffuse_f.rgb *= lightmap_fragment();
} else { #else
diffuse_f.rgb *= lightmap_fragment(normal_f); diffuse_f.rgb *= lightmap_fragment(normal_f);
} #endif
#ifdef FAKESHADOWS #ifdef FAKESHADOWS
diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); diffuse_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif #endif
#if r_skipSpecular==0
cube_c = reflect(normalize(-eyevector), normal_f.rgb); cube_c = reflect(normalize(-eyevector), normal_f.rgb);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz; cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
out_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diffuse_f.rgb, gloss); out_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diffuse_f.rgb, gloss);
#endif
out_f.rgb += spec; out_f.rgb += spec;
gl_FragColor = fog4(out_f); gl_FragColor = fog4(out_f);

View file

@ -8,24 +8,17 @@
//============================================================================== //==============================================================================
!!ver 100 300 !!ver 100 300
!!permu TESS
!!permu BUMP !!permu BUMP
!!permu FRAMEBLEND !!permu FRAMEBLEND
!!permu SKELETAL !!permu SKELETAL
!!permu UPPERLOWER
!!permu FOG !!permu FOG
!!permu REFLECTCUBEMASK !!permu REFLECTCUBEMASK
!!cvarf r_glsl_offsetmapping_scale !!cvarf r_glsl_offsetmapping_scale
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!cvardf r_tessellation_level=5
!!samps diffuse normalmap specular upper lower reflectcube reflectmask !!samps diffuse normalmap specular upper lower reflectcube reflectmask
!!samps =PCF shadowmap !!samps =PCF shadowmap
!!samps =CUBE projectionmap !!samps =CUBE projectionmap
!!cvardf dev_skipnormal !!cvardf r_skipNormal
#if defined(ORM) || defined(SG)
#define PBR
#endif
#include "sys/defs.h" #include "sys/defs.h"
@ -43,26 +36,19 @@
#extension GL_ARB_texture_gather : enable #extension GL_ARB_texture_gather : enable
#endif #endif
#ifdef UPPERLOWER
#define UPPER
#define LOWER
#endif
//if there's no vertex normals known, disable some stuff. //if there's no vertex normals known, disable some stuff.
//FIXME: this results in dupe permutations. //FIXME: this results in dupe permutations.
#ifdef NOBUMP #ifdef NOBUMP
#undef SPECULAR #undef SPECULAR
#undef BUMP #undef BUMP
#undef OFFSETMAPPING
#endif #endif
#if !defined(TESS_CONTROL_SHADER) varying vec2 tex_c;
varying vec2 tcbase;
varying vec3 lightvector; varying vec3 lightvector;
#if defined(VERTEXCOLOURS) #if defined(VERTEXCOLOURS)
varying vec4 vc; varying vec4 vc;
#endif #endif
#if defined(SPECULAR) || defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK) #if defined(SPECULAR) || defined(REFLECTCUBEMASK)
varying vec3 eyevector; varying vec3 eyevector;
#endif #endif
#ifdef REFLECTCUBEMASK #ifdef REFLECTCUBEMASK
@ -71,22 +57,19 @@
#if defined(PCF) || defined(CUBE) || defined(SPOT) || defined(ORTHO) #if defined(PCF) || defined(CUBE) || defined(SPOT) || defined(ORTHO)
varying vec4 vtexprojcoord; varying vec4 vtexprojcoord;
#endif #endif
#endif
#ifdef VERTEX_SHADER #ifdef VERTEX_SHADER
#ifdef TESS
varying vec3 vertex, normal;
#endif
#include "sys/skeletal.h" #include "sys/skeletal.h"
void main () void main ()
{ {
vec3 n, s, t, w; vec3 n, s, t, w;
gl_Position = skeletaltransform_wnst(w,n,s,t); gl_Position = skeletaltransform_wnst(w,n,s,t);
n = normalize(n); n = normalize(n);
s = normalize(s); s = normalize(s);
t = normalize(t); t = normalize(t);
tcbase = v_texcoord; //pass the texture coords straight through tex_c = v_texcoord; //pass the texture coords straight through
#ifdef ORTHO #ifdef ORTHO
vec3 lightminusvertex = -l_lightdirection; vec3 lightminusvertex = -l_lightdirection;
lightvector.x = dot(lightminusvertex, s.xyz); lightvector.x = dot(lightminusvertex, s.xyz);
@ -107,7 +90,7 @@ t = normalize(t);
#if defined(VERTEXCOLOURS) #if defined(VERTEXCOLOURS)
vc = v_colour; vc = v_colour;
#endif #endif
#if defined(SPECULAR)||defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK) #if defined(SPECULAR) || defined(REFLECTCUBEMASK)
vec3 eyeminusvertex = e_eyepos - w.xyz; vec3 eyeminusvertex = e_eyepos - w.xyz;
eyevector.x = dot(eyeminusvertex, s.xyz); eyevector.x = dot(eyeminusvertex, s.xyz);
eyevector.y = dot(eyeminusvertex, t.xyz); eyevector.y = dot(eyeminusvertex, t.xyz);
@ -121,130 +104,15 @@ t = normalize(t);
vtexprojcoord = (l_cubematrix*vec4(w.xyz, 1.0)); vtexprojcoord = (l_cubematrix*vec4(w.xyz, 1.0));
#endif #endif
#ifdef TESS
vertex = w;
normal = n;
#endif
} }
#endif #endif
#if defined(TESS_CONTROL_SHADER)
layout(vertices = 3) out;
in vec3 vertex[];
out vec3 t_vertex[];
in vec3 normal[];
out vec3 t_normal[];
in vec2 tcbase[];
out vec2 t_tcbase[];
in vec3 lightvector[];
out vec3 t_lightvector[];
#if defined(VERTEXCOLOURS)
in vec4 vc[];
out vec4 t_vc[];
#endif
#if defined(SPECULAR) || defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK)
in vec3 eyevector[];
out vec3 t_eyevector[];
#endif
void main()
{
//the control shader needs to pass stuff through
#define id gl_InvocationID
t_vertex[id] = vertex[id];
t_normal[id] = normal[id];
t_tcbase[id] = tcbase[id];
t_lightvector[id] = lightvector[id];
#if defined(VERTEXCOLOURS)
t_vc[id] = vc[id];
#endif
#if defined(SPECULAR) || defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK)
t_eyevector[id] = eyevector[id];
#endif
gl_TessLevelOuter[0] = float(r_tessellation_level);
gl_TessLevelOuter[1] = float(r_tessellation_level);
gl_TessLevelOuter[2] = float(r_tessellation_level);
gl_TessLevelInner[0] = float(r_tessellation_level);
}
#endif
#if defined(TESS_EVALUATION_SHADER)
layout(triangles) in;
in vec3 t_vertex[];
in vec3 t_normal[];
in vec2 t_tcbase[];
in vec3 t_lightvector[];
#if defined(VERTEXCOLOURS)
in vec4 t_vc[];
#endif
#if defined(SPECULAR) || defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK)
in vec3 t_eyevector[];
#endif
#define LERP(a) (gl_TessCoord.x*a[0] + gl_TessCoord.y*a[1] + gl_TessCoord.z*a[2])
void main()
{
#define factor 1.0
tcbase = LERP(t_tcbase);
vec3 w = LERP(t_vertex);
vec3 t0 = w - dot(w-t_vertex[0],t_normal[0])*t_normal[0];
vec3 t1 = w - dot(w-t_vertex[1],t_normal[1])*t_normal[1];
vec3 t2 = w - dot(w-t_vertex[2],t_normal[2])*t_normal[2];
w = w*(1.0-factor) + factor*(gl_TessCoord.x*t0+gl_TessCoord.y*t1+gl_TessCoord.z*t2);
#if defined(PCF) || defined(SPOT) || defined(CUBE) || defined(ORTHO)
//for texture projections/shadowmapping on dlights
vtexprojcoord = (l_cubematrix*vec4(w.xyz, 1.0));
#endif
//FIXME: we should be recalcing these here, instead of just lerping them
lightvector = LERP(t_lightvector);
#if defined(VERTEXCOLOURS)
vc = LERP(t_vc);
#endif
#if defined(SPECULAR) || defined(OFFSETMAPPING) || defined(REFLECTCUBEMASK)
eyevector = LERP(t_eyevector);
#endif
gl_Position = m_modelviewprojection * vec4(w,1.0);
}
#endif
#ifdef FRAGMENT_SHADER #ifdef FRAGMENT_SHADER
#include "sys/fog.h" #include "sys/fog.h"
#include "sys/pcf.h" #include "sys/pcf.h"
#ifdef OFFSETMAPPING
#include "sys/offsetmapping.h"
#endif
#include "sys/pbr.h"
void main () void main ()
{ {
@ -265,41 +133,29 @@ void main ()
#endif #endif
//read raw texture samples (offsetmapping munges the tex coords first) //read raw texture samples (offsetmapping munges the tex coords first)
#ifdef OFFSETMAPPING
vec2 tcoffsetmap = offsetmap(s_normalmap, tcbase, eyevector);
#define tcbase tcoffsetmap
#endif
#if defined(FLAT) #if defined(FLAT)
vec4 bases = vec4(FLAT, FLAT, FLAT, 1.0); vec4 bases = vec4(FLAT, FLAT, FLAT, 1.0);
#else #else
vec4 bases = texture2D(s_diffuse, tcbase); vec4 bases = texture2D(s_diffuse, tex_c);
#ifdef VERTEXCOLOURS #ifdef VERTEXCOLOURS
bases.rgb *= bases.a; bases.rgb *= bases.a;
#endif #endif
#endif #endif
#ifdef UPPER
vec4 uc = texture2D(s_upper, tcbase);
bases.rgb += uc.rgb*e_uppercolour*uc.a;
#endif
#ifdef LOWER
vec4 lc = texture2D(s_lower, tcbase);
bases.rgb += lc.rgb*e_lowercolour*lc.a;
#endif
#if defined(BUMP) || defined(SPECULAR) || defined(REFLECTCUBEMASK)
vec3 bumps;
if (float(dev_skipnormal) == 0.0) {
bumps = normalize(vec3(texture2D(s_normalmap, tcbase)) - 0.5);
/* fix it up a bit */ #if defined(BUMP) || defined(SPECULAR) || defined(REFLECTCUBEMASK)
bumps = normalize(bumps);
} else { #if r_skipNormals==1
bumps = vec3(0.0,0.0,1.0); vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
} #else
#define normal_f vec3(0.0,0.0,0.5)
#endif
#elif defined(REFLECTCUBEMASK) #elif defined(REFLECTCUBEMASK)
vec3 bumps = vec3(0.0,0.0,1.0); vec3 normal_f = vec3(0.0,0.0,1.0);
#endif #endif
#ifdef SPECULAR #ifdef SPECULAR
vec4 specs = texture2D(s_specular, tcbase); vec4 specs = texture2D(s_specular, tex_c);
#endif #endif
#define dielectricSpecular 0.04 #define dielectricSpecular 0.04
@ -329,9 +185,6 @@ void main ()
#define specrgb 1.0 //vec3(dielectricSpecular) #define specrgb 1.0 //vec3(dielectricSpecular)
#endif #endif
#ifdef PBR
vec3 diff = DoPBR(bumps, normalize(eyevector), normalize(lightvector), roughness, bases.rgb, specrgb, l_lightcolourscale);
#else
vec3 diff; vec3 diff;
#ifdef NOBUMP #ifdef NOBUMP
//surface can only support ambient lighting, even for lights that try to avoid it. //surface can only support ambient lighting, even for lights that try to avoid it.
@ -339,24 +192,23 @@ void main ()
#else #else
vec3 nl = normalize(lightvector); vec3 nl = normalize(lightvector);
#ifdef BUMP #ifdef BUMP
diff = bases.rgb * (l_lightcolourscale.x + l_lightcolourscale.y * max(dot(bumps, nl), 0.0)); diff = bases.rgb * (l_lightcolourscale.x + l_lightcolourscale.y * max(dot(normal_f, nl), 0.0));
#else #else
//we still do bumpmapping even without bumps to ensure colours are always sane. light.exe does it too. //we still do bumpmapping even without normal_f to ensure colours are always sane. light.exe does it too.
diff = bases.rgb * (l_lightcolourscale.x + l_lightcolourscale.y * max(dot(vec3(0.0, 0.0, 1.0), nl), 0.0)); diff = bases.rgb * (l_lightcolourscale.x + l_lightcolourscale.y * max(dot(vec3(0.0, 0.0, 1.0), nl), 0.0));
#endif #endif
#endif #endif
#ifdef SPECULAR #ifdef SPECULAR
vec3 halfdir = normalize(normalize(eyevector) + nl); vec3 halfdir = normalize(normalize(eyevector) + nl);
float spec = pow(max(dot(halfdir, bumps), 0.0), FTE_SPECULAR_EXPONENT * gloss)*float(SPECMUL); float spec = pow(max(dot(halfdir, normal_f), 0.0), FTE_SPECULAR_EXPONENT * gloss)*float(SPECMUL);
diff += l_lightcolourscale.z * spec * specrgb; diff += l_lightcolourscale.z * spec * specrgb;
#endif #endif
#endif
#ifdef REFLECTCUBEMASK #ifdef REFLECTCUBEMASK
vec3 rtc = reflect(-eyevector, bumps); vec3 rtc = reflect(-eyevector, normal_f);
rtc = rtc.x*invsurface[0] + rtc.y*invsurface[1] + rtc.z*invsurface[2]; rtc = rtc.x*invsurface[0] + rtc.y*invsurface[1] + rtc.z*invsurface[2];
rtc = (m_model * vec4(rtc.xyz,0.0)).xyz; rtc = (m_model * vec4(rtc.xyz,0.0)).xyz;
diff += texture2D(s_reflectmask, tcbase).rgb * textureCube(s_reflectcube, rtc).rgb; diff += texture2D(s_reflectmask, tex_c).rgb * textureCube(s_reflectcube, rtc).rgb;
#endif #endif
#ifdef CUBE #ifdef CUBE

View file

@ -21,7 +21,7 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipnormal !!cvardf r_skipNormal
#include "sys/defs.h" #include "sys/defs.h"
@ -80,6 +80,7 @@ varying vec2 lm1, lm2, lm3;
return lightmaps; return lightmaps;
} }
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f) vec3 lightmap_fragment(vec3 normal_f)
{ {
#ifndef DELUXE #ifndef DELUXE
@ -99,16 +100,20 @@ varying vec2 lm1, lm2, lm3;
return lightmaps; return lightmaps;
#endif #endif
} }
#endif
void main ( void ) void main ( void )
{ {
vec4 diff1_f = texture2D( s_t0, tex_c); vec4 diff1_f = texture2D( s_t0, tex_c);
vec4 diff2_f = texture2D( s_t1, tex_c); vec4 diff2_f = texture2D( s_t1, tex_c);
vec3 normal1_f = normalize(texture2D(s_t2, tex_c).rgb - 0.5);
vec3 normal2_f = normalize(texture2D(s_t3, tex_c).rgb - 0.5);
float alpha = 1.0; float alpha = 1.0;
float bw = 1.0 - (diff2_f.r + diff2_f.g + diff2_f.b) / 3.0; float bw = 1.0 - (diff2_f.r + diff2_f.g + diff2_f.b) / 3.0;
#if r_skipNormal==0
vec3 normal1_f = normalize(texture2D(s_t2, tex_c).rgb - 0.5);
vec3 normal2_f = normalize(texture2D(s_t3, tex_c).rgb - 0.5);
#endif
if (vex_color.a < 1.0) { if (vex_color.a < 1.0) {
if (bw > vex_color.a) { if (bw > vex_color.a) {
alpha = 0.0; alpha = 0.0;
@ -116,14 +121,19 @@ varying vec2 lm1, lm2, lm3;
} }
/* light */ /* light */
#if r_skipNormal==0
diff1_f.rgb *= lightmap_fragment(normal1_f); diff1_f.rgb *= lightmap_fragment(normal1_f);
diff2_f.rgb *= lightmap_fragment(normal2_f); diff2_f.rgb *= lightmap_fragment(normal2_f);
#else
diff1_f.rgb *= lightmap_fragment();
diff2_f.rgb *= lightmap_fragment();
#endif
vec3 output_f = mix( diff1_f.rgb, diff2_f.rgb, alpha ); vec3 output_f = mix( diff1_f.rgb, diff2_f.rgb, alpha );
#ifdef FAKESHADOWS #ifdef FAKESHADOWS
output_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); output_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);
#endif #endif
gl_FragColor = fog4( vec4( output_f.rgb, 1.0 ) ); gl_FragColor = fog4( vec4( output_f.rgb, 1.0 ) );
} }

View file

@ -20,7 +20,8 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipnormal !!cvardf r_skipDiffuse
!!cvardf r_skipNormal
#include "sys/defs.h" #include "sys/defs.h"
@ -65,35 +66,70 @@ varying vec2 lm1, lm2, lm3;
#include "sys/fog.h" #include "sys/fog.h"
#include "sys/pcf.h" #include "sys/pcf.h"
vec3 lightmap_fragment (vec3 normal_f) vec3 lightmap_fragment()
{ {
vec3 lightmaps; vec3 lightmaps;
#ifdef LIGHTSTYLED #ifdef LIGHTSTYLED
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb;
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb;
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb;
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb;
#else #else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb;
#endif #endif
return lightmaps; return lightmaps;
} }
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif
return lightmaps;
#endif
}
#endif
void main ( void ) void main ( void )
{ {
vec3 diffuse_f = texture2D( s_diffuse, tex_c ).rgb; #if r_skipDiffuse==0
vec3 diffuse_f = texture2D(s_diffuse, tex_c).rgb;
#else
vec3 diffuse_f = vec3(1.0,1.0,1.0);
#endif
float bw = 1.0 - (diffuse_f.r + diffuse_f.g + diffuse_f.b) / 3.0; float bw = 1.0 - (diffuse_f.r + diffuse_f.g + diffuse_f.b) / 3.0;
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
vec4 vcol = vex_color; vec4 vcol = vex_color;
#if r_skipNormal==0
vec3 normal_f;
normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
#endif
if (vcol.a < 1.0) { if (vcol.a < 1.0) {
if (bw > vcol.a) { if (bw > vcol.a) {
discard; discard;
} }
} }
diffuse_f *= lightmap_fragment(normal_f); #if r_skipNormal==0
diffuse_f.rgb *= lightmap_fragment(normal_f);
#else
diffuse_f.rgb *= lightmap_fragment();
#endif
#ifdef FAKESHADOWS #ifdef FAKESHADOWS
diffuse_f *= ShadowmapFilter(s_shadowmap, vtexprojcoord); diffuse_f *= ShadowmapFilter(s_shadowmap, vtexprojcoord);

View file

@ -20,7 +20,8 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipnormal !!cvardf r_skipDiffuse
!!cvardf r_skipNormal
#include "sys/defs.h" #include "sys/defs.h"
@ -65,29 +66,60 @@ varying vec2 lm1, lm2, lm3;
#include "sys/fog.h" #include "sys/fog.h"
#include "sys/pcf.h" #include "sys/pcf.h"
vec3 lightmap_fragment (vec3 normal_f) vec3 lightmap_fragment()
{ {
vec3 lightmaps; vec3 lightmaps;
#ifdef LIGHTSTYLED #ifdef LIGHTSTYLED
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb;
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb;
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb;
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb;
#else #else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb;
#endif #endif
return lightmaps; return lightmaps;
} }
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif
return lightmaps;
#endif
}
#endif
void main ( void ) void main ( void )
{ {
vec3 diffuse_f = texture2D( s_diffuse, tex_c ).rgb; #if r_skipDiffuse==0
vec3 normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5); vec3 diffuse_f = texture2D(s_diffuse, tex_c).rgb;
#else
vec3 diffuse_f = vec3(1.0,1.0,1.0);
#endif
float bw = (diffuse_f.r + diffuse_f.g + diffuse_f.b) / 3.0; float bw = (diffuse_f.r + diffuse_f.g + diffuse_f.b) / 3.0;
vec4 vcol = vex_color; vec4 vcol = vex_color;
float alpha = 1.0; float alpha = 1.0;
#if r_skipNormal==0
vec3 normal_f;
normal_f = normalize(texture2D(s_normalmap, tex_c).rgb - 0.5);
#endif
if (vcol.a < 1.0) { if (vcol.a < 1.0) {
if (bw > vcol.a) { if (bw > vcol.a) {
discard; discard;
@ -97,7 +129,11 @@ varying vec2 lm1, lm2, lm3;
if (bw > (vcol.a * 0.25)) if (bw > (vcol.a * 0.25))
alpha = vcol.a; alpha = vcol.a;
diffuse_f *= lightmap_fragment(normal_f); #if r_skipNormal==0
diffuse_f.rgb *= lightmap_fragment(normal_f);
#else
diffuse_f.rgb *= lightmap_fragment();
#endif
#ifdef FAKESHADOWS #ifdef FAKESHADOWS
diffuse_f *= ShadowmapFilter(s_shadowmap, vtexprojcoord); diffuse_f *= ShadowmapFilter(s_shadowmap, vtexprojcoord);

View file

@ -48,20 +48,42 @@ varying vec2 lm1, lm2, lm3;
#endif #endif
#ifdef FRAGMENT_SHADER #ifdef FRAGMENT_SHADER
vec3 lightmap_fragment (vec3 normal_f) vec3 lightmap_fragment()
{ {
vec3 lightmaps; vec3 lightmaps;
#ifdef LIGHTSTYLED #ifdef LIGHTSTYLED
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb;
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb;
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb;
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb;
#else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb;
#endif
return lightmaps;
}
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f)
{
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps;
#if defined(LIGHTSTYLED)
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else #else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif #endif
return lightmaps; return lightmaps;
#endif
} }
#endif
void main () void main ()
{ {

View file

@ -19,8 +19,8 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipdiffuse !!cvardf r_skipDiffuse
!!cvardf dev_skipnormal !!cvardf r_skipNormal
#include "sys/defs.h" #include "sys/defs.h"
@ -81,20 +81,27 @@ varying vec2 lm1, lm2, lm3;
return lightmaps; return lightmaps;
} }
#if r_skipNormal==0
vec3 lightmap_fragment(vec3 normal_f) vec3 lightmap_fragment(vec3 normal_f)
{ {
#ifndef DELUXE
return lightmap_fragment();
#else
vec3 lightmaps; vec3 lightmaps;
#ifdef LIGHTSTYLED #if defined(LIGHTSTYLED)
lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap0, lm0).rgb * e_lmscale[0].rgb * dot(normal_f, (texture2D(s_deluxemap0, lm0).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap1, lm1).rgb * e_lmscale[1].rgb * dot(normal_f, (texture2D(s_deluxemap1, lm1).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap2, lm2).rgb * e_lmscale[2].rgb * dot(normal_f, (texture2D(s_deluxemap2, lm2).rgb - 0.5) * 2.0);
lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0); lightmaps += texture2D(s_lightmap3, lm3).rgb * e_lmscale[3].rgb * dot(normal_f, (texture2D(s_deluxemap3, lm3).rgb - 0.5) * 2.0);
#else #else
lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0); lightmaps = texture2D(s_lightmap, lm0).rgb * e_lmscale.rgb * dot(normal_f, (texture2D(s_deluxemap, lm0).rgb - 0.5) * 2.0);
#endif #endif
return lightmaps; return lightmaps;
#endif
} }
#endif
void main ( void ) void main ( void )
{ {
@ -108,7 +115,7 @@ varying vec2 lm1, lm2, lm3;
diff1_f.rgb *= d1_f; diff1_f.rgb *= d1_f;
diff2_f.rgb *= d2_f; diff2_f.rgb *= d2_f;
if (float(dev_skipnormal) == 1.0) { if (float(r_skipNormal) == 1.0) {
diff1_f.rgb *= lightmap_fragment(); diff1_f.rgb *= lightmap_fragment();
diff2_f.rgb *= lightmap_fragment(); diff2_f.rgb *= lightmap_fragment();
} else { } else {

View file

@ -16,7 +16,7 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipdiffuse !!cvardf r_skipDiffuse
#include "sys/defs.h" #include "sys/defs.h"
@ -62,18 +62,17 @@ varying vec3 norm;
{ {
vec4 diff_f = texture2D(s_diffuse, tex_c); vec4 diff_f = texture2D(s_diffuse, tex_c);
vec4 fb_f = texture2D(s_fullbright, tex_c); vec4 fb_f = texture2D(s_fullbright, tex_c);
vec3 normal_f = (texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0;
vec3 light; vec3 light;
if (diff_f.a < 0.5) { if (diff_f.a < 0.5) {
discard; discard;
} }
#ifdef HALFLAMBERT #ifdef HALFLAMBERT
light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir)); light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir));
#else #else
light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir)); light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir));
#endif #endif
diff_f.rgb *= light; diff_f.rgb *= light;
diff_f.rgb += fb_f.rgb; diff_f.rgb += fb_f.rgb;

View file

@ -16,7 +16,8 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipenvmaps !!cvardf r_skipSpecular
!!cvardf r_skipNormal
#include "sys/defs.h" #include "sys/defs.h"
@ -76,28 +77,35 @@ varying mat3 invsurface;
vec3 cube_c; vec3 cube_c;
vec4 out_f = vec4(1.0, 1.0, 1.0, 1.0); vec4 out_f = vec4(1.0, 1.0, 1.0, 1.0);
vec4 diff_f = texture2D(s_diffuse, tex_c); vec4 diff_f = texture2D(s_diffuse, tex_c);
vec4 normal_f = (texture2D(s_normalmap, tex_c) - 0.5) * 2.0;
vec3 light; vec3 light;
#if r_skipNormal==0
vec3 normal_f = (texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0;
float refl = texture2D(s_normalmap, tex_c).a;
#else
#define normal_f vec3(0.0,0.0,1.0)
float refl = texture2D(s_normalmap, tex_c).a;
#endif
if (diff_f.a < 0.5) { if (diff_f.a < 0.5) {
discard; discard;
} }
#ifdef HALFLAMBERT #ifdef HALFLAMBERT
light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir)); light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir));
#else #else
light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir)); light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir));
#endif #endif
if (float(dev_skipenvmaps) == 0.0) { #if r_skipSpecular==0
cube_c = reflect(normalize(eyevector), normal_f.rgb); cube_c = reflect(normalize(eyevector), normal_f.rgb);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz; cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
diff_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diff_f.rgb, diff_f.a); diff_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diff_f.rgb, diff_f.a);
} #endif
diff_f.rgb *= light; diff_f.rgb *= light;
out_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diff_f.rgb, normal_f.a); out_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diff_f.rgb, refl);
#ifdef FAKESHADOWS #ifdef FAKESHADOWS
out_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord); out_f.rgb *= ShadowmapFilter(s_shadowmap, vtexprojcoord);

View file

@ -16,9 +16,9 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipdiffuse !!cvardf r_skipDiffuse
!!cvardf dev_skipspecular !!cvardf r_skipSpecular
!!cvardf dev_skipenvmaps !!cvardf r_skipNormal
#include "sys/defs.h" #include "sys/defs.h"
@ -71,30 +71,41 @@ varying mat3 invsurface;
void main () void main ()
{ {
vec4 diffuse_f = texture2D( s_diffuse, tex_c );
vec3 normal_f = (texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0;
vec4 fb_f = texture2D(s_fullbright, tex_c); vec4 fb_f = texture2D(s_fullbright, tex_c);
float gloss = texture2D( s_normalmap, tex_c ).a;
vec3 new_e_light_dir = vec3(cos(e_time), sin(e_time), 0); vec3 new_e_light_dir = vec3(cos(e_time), sin(e_time), 0);
vec3 light; vec3 light;
#if r_skipDiffuse==0
vec4 diffuse_f = texture2D(s_diffuse, tex_c);
#else
vec4 diffuse_f = vec4(1.0,1.0,1.0,1.0);
#endif
#if r_skipNormal==0
vec3 normal_f = (texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0;
float gloss = texture2D(s_normalmap, tex_c).a;
#else
#define normal_f vec3(0.0,0.0,1.0)
float gloss = texture2D(s_normalmap, tex_c).a;
#endif
if (diffuse_f.a < 0.5) { if (diffuse_f.a < 0.5) {
discard; discard;
} }
#ifdef HALFLAMBERT #ifdef HALFLAMBERT
light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir)); light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir));
#else #else
light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir)); light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir));
#endif #endif
if (float(dev_skipspecular) == 0.0) { #if r_skipSpecular==0
vec3 halfdir = normalize(normalize(eyevector) + e_light_dir); vec3 halfdir = normalize(normalize(eyevector) + e_light_dir);
vec3 bumps = normalize(invsurface * (normal_f)); vec3 bumps = normalize(invsurface * (normal_f));
float spec = pow(max(dot(halfdir, bumps), 0.0), FTE_SPECULAR_EXPONENT); float spec = pow(max(dot(halfdir, bumps), 0.0), FTE_SPECULAR_EXPONENT);
spec *= 5.0 * (1.0 - gloss); spec *= 5.0 * (1.0 - gloss);
diffuse_f.rgb += spec; diffuse_f.rgb += spec;
} #endif
diffuse_f.rgb *= light; diffuse_f.rgb *= light;
diffuse_f.rgb += fb_f.rgb; diffuse_f.rgb += fb_f.rgb;

View file

@ -17,7 +17,8 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipnormal !!cvardf r_skipNormal
!!cvardf r_skipSpecular
#include "sys/defs.h" #include "sys/defs.h"
@ -72,26 +73,34 @@ varying mat3 invsurface;
{ {
vec3 cube_c; vec3 cube_c;
vec4 diffuse_f = texture2D( s_diffuse, tex_c ); vec4 diffuse_f = texture2D( s_diffuse, tex_c );
vec3 normal_f = (texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0;
float gloss = texture2D( s_normalmap, tex_c ).a;
vec3 new_e_light_dir = vec3(cos(e_time), sin(e_time), 0); vec3 new_e_light_dir = vec3(cos(e_time), sin(e_time), 0);
vec3 light; vec3 light;
#ifdef HALFLAMBERT #if r_skipNormal==0
light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir)); vec3 normal_f = (texture2D(s_normalmap, tex_c).rgb - 0.5) * 2.0;
#else float gloss = texture2D(s_normalmap, tex_c).a;
light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir)); #else
#endif #define normal_f vec3(0.0,0.0,1.0)
float gloss = texture2D(s_normalmap, tex_c).a;
#endif
/* specular */ #ifdef HALFLAMBERT
light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir));
#else
light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir));
#endif
#if r_skipSpecular==0
vec3 halfdir = normalize(normalize(eyevector) + e_light_dir); vec3 halfdir = normalize(normalize(eyevector) + e_light_dir);
vec3 bumps = normalize(invsurface * (normal_f)); vec3 bumps = normalize(invsurface * (normal_f));
float spec = pow(max(dot(halfdir, bumps), 0.0), FTE_SPECULAR_EXPONENT); float spec = pow(max(dot(halfdir, bumps), 0.0), FTE_SPECULAR_EXPONENT);
spec *= 5.0 * (1.0 - gloss); spec *= 5.0 * (1.0 - gloss);
diffuse_f.rgb += spec * diffuse_f.a; diffuse_f.rgb += spec * diffuse_f.a;
#endif
/* reflectcube */ /* reflectcube */
cube_c = reflect(normalize(-eyevector), normal_f.rgb * 0.5); cube_c = reflect(normalize(-eyevector), normal_f.rgb);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2]; cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz; cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
diffuse_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diffuse_f.rgb, diffuse_f.a); diffuse_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diffuse_f.rgb, diffuse_f.a);

View file

@ -16,10 +16,9 @@
!!cvardf r_glsl_pcf !!cvardf r_glsl_pcf
!!samps =FAKESHADOWS shadowmap !!samps =FAKESHADOWS shadowmap
!!cvardf dev_skipdiffuse !!cvardf r_skipDiffuse
!!cvardf dev_skipnormal !!cvardf r_skipNormal
!!cvardf dev_skipspecular !!cvardf r_skipSpecular
!!cvardf dev_skipenvmaps
#include "sys/defs.h" #include "sys/defs.h"
@ -79,27 +78,26 @@ varying mat3 invsurface;
vec3 new_e_light_dir = vec3(cos(e_time), sin(e_time), 0); vec3 new_e_light_dir = vec3(cos(e_time), sin(e_time), 0);
vec3 light; vec3 light;
#ifdef HALFLAMBERT #ifdef HALFLAMBERT
light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir)); light = e_light_ambient + (e_light_mul * halflambert(norm, e_light_dir));
#else #else
light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir)); light = e_light_ambient + (e_light_mul * lambert(norm, e_light_dir));
#endif #endif
#if r_skipSpecular==0
// gloss pass
vec3 halfdir = normalize(normalize(eyevector) + e_light_dir);
vec3 bumps = normalize(invsurface * (normal_f));
float spec = pow(max(dot(halfdir, bumps), 0.0), FTE_SPECULAR_EXPONENT);
spec *= 5.0 * (1.0 - gloss);
diffuse_f.rgb += spec;
// envmap pass
cube_c = reflect(normalize(-eyevector), normal_f.rgb * 0.5);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
diffuse_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diffuse_f.rgb, gloss);
#endif
if (float(dev_skipspecular) == 0.0) {
vec3 halfdir = normalize(normalize(eyevector) + e_light_dir);
vec3 bumps = normalize(invsurface * (normal_f));
float spec = pow(max(dot(halfdir, bumps), 0.0), FTE_SPECULAR_EXPONENT);
spec *= 5.0 * (1.0 - gloss);
diffuse_f.rgb += spec;
}
if (float(dev_skipenvmaps) == 0.0) {
cube_c = reflect(normalize(-eyevector), normal_f.rgb * 0.5);
cube_c = cube_c.x * invsurface[0] + cube_c.y * invsurface[1] + cube_c.z * invsurface[2];
cube_c = (m_model * vec4(cube_c.xyz, 0.0)).xyz;
diffuse_f.rgb = mix(textureCube(s_reflectcube, cube_c).rgb, diffuse_f.rgb, gloss);
}
diffuse_f.rgb *= light; diffuse_f.rgb *= light;
#ifdef FAKESHADOWS #ifdef FAKESHADOWS