* PostShadowPSSM: Made texSize const, to fix shader error

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9284 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
Sha..om 13 years ago
parent 904d835742
commit 9aacd96926
  1. 318
      engine/src/core-data/Common/MatDefs/Shadow/PostShadowPSSM.frag

@ -1,159 +1,159 @@
#ifdef HARDWARE_SHADOWS #ifdef HARDWARE_SHADOWS
#define SHADOWMAP sampler2DShadow #define SHADOWMAP sampler2DShadow
#define SHADOWCOMPARE(tex,coord) shadow2DProj(tex, coord).r #define SHADOWCOMPARE(tex,coord) shadow2DProj(tex, coord).r
#else #else
#define SHADOWMAP sampler2D #define SHADOWMAP sampler2D
#define SHADOWCOMPARE(tex,coord) step(coord.z, texture2DProj(tex, coord).r) #define SHADOWCOMPARE(tex,coord) step(coord.z, texture2DProj(tex, coord).r)
#endif #endif
#if FILTER_MODE == 0 #if FILTER_MODE == 0
#define GETSHADOW Shadow_DoShadowCompare #define GETSHADOW Shadow_DoShadowCompare
#define KERNEL 1.0 #define KERNEL 1.0
#elif FILTER_MODE == 1 #elif FILTER_MODE == 1
#ifdef HARDWARE_SHADOWS #ifdef HARDWARE_SHADOWS
#define GETSHADOW Shadow_DoShadowCompare #define GETSHADOW Shadow_DoShadowCompare
#else #else
#define GETSHADOW Shadow_DoBilinear_2x2 #define GETSHADOW Shadow_DoBilinear_2x2
#endif #endif
#define KERNEL 1.0 #define KERNEL 1.0
#elif FILTER_MODE == 2 #elif FILTER_MODE == 2
#define GETSHADOW Shadow_DoDither_2x2 #define GETSHADOW Shadow_DoDither_2x2
#define KERNEL 1.0 #define KERNEL 1.0
#elif FILTER_MODE == 3 #elif FILTER_MODE == 3
#define GETSHADOW Shadow_DoPCF #define GETSHADOW Shadow_DoPCF
#define KERNEL 4.0 #define KERNEL 4.0
#elif FILTER_MODE == 4 #elif FILTER_MODE == 4
#define GETSHADOW Shadow_DoPCF #define GETSHADOW Shadow_DoPCF
#define KERNEL 8.0 #define KERNEL 8.0
#endif #endif
uniform SHADOWMAP m_ShadowMap0; uniform SHADOWMAP m_ShadowMap0;
uniform SHADOWMAP m_ShadowMap1; uniform SHADOWMAP m_ShadowMap1;
uniform SHADOWMAP m_ShadowMap2; uniform SHADOWMAP m_ShadowMap2;
uniform SHADOWMAP m_ShadowMap3; uniform SHADOWMAP m_ShadowMap3;
uniform vec4 m_Splits; uniform vec4 m_Splits;
uniform float m_ShadowIntensity; uniform float m_ShadowIntensity;
varying vec4 projCoord0; varying vec4 projCoord0;
varying vec4 projCoord1; varying vec4 projCoord1;
varying vec4 projCoord2; varying vec4 projCoord2;
varying vec4 projCoord3; varying vec4 projCoord3;
varying float shadowPosition; varying float shadowPosition;
float texSize = 1024.0; const float texSize = 1024.0;
const float pixSize = 1.0 / texSize; const float pixSize = 1.0 / texSize;
const vec2 pixSize2 = vec2(pixSize); const vec2 pixSize2 = vec2(pixSize);
float Shadow_DoShadowCompareOffset(in SHADOWMAP tex, in vec4 projCoord, in vec2 offset){ float Shadow_DoShadowCompareOffset(in SHADOWMAP tex, in vec4 projCoord, in vec2 offset){
vec4 coord = vec4(projCoord.xy + offset.xy * pixSize2, projCoord.zw); vec4 coord = vec4(projCoord.xy + offset.xy * pixSize2, projCoord.zw);
return SHADOWCOMPARE(tex, coord); return SHADOWCOMPARE(tex, coord);
} }
float Shadow_DoShadowCompare(in SHADOWMAP tex, vec4 projCoord){ float Shadow_DoShadowCompare(in SHADOWMAP tex, vec4 projCoord){
return SHADOWCOMPARE(tex, projCoord); return SHADOWCOMPARE(tex, projCoord);
} }
float Shadow_BorderCheck(in vec2 coord){ float Shadow_BorderCheck(in vec2 coord){
// Fastest, "hack" method (uses 4-5 instructions) // Fastest, "hack" method (uses 4-5 instructions)
vec4 t = vec4(coord.xy, 0.0, 1.0); vec4 t = vec4(coord.xy, 0.0, 1.0);
t = step(t.wwxy, t.xyzz); t = step(t.wwxy, t.xyzz);
return dot(t,t); return dot(t,t);
} }
float Shadow_DoDither_2x2(in SHADOWMAP tex, in vec4 projCoord){ float Shadow_DoDither_2x2(in SHADOWMAP tex, in vec4 projCoord){
float border = Shadow_BorderCheck(projCoord.xy); float border = Shadow_BorderCheck(projCoord.xy);
if (border > 0.0) if (border > 0.0)
return 1.0; return 1.0;
float shadow = 0.0; float shadow = 0.0;
vec2 o = mod(floor(gl_FragCoord.xy), 2.0); vec2 o = mod(floor(gl_FragCoord.xy), 2.0);
shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2(-1.5, 1.5) + o); shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2(-1.5, 1.5) + o);
shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2( 0.5, 1.5) + o); shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2( 0.5, 1.5) + o);
shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2(-1.5, -0.5) + o); shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2(-1.5, -0.5) + o);
shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2( 0.5, -0.5) + o); shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2( 0.5, -0.5) + o);
shadow *= 0.25 ; shadow *= 0.25 ;
return shadow; return shadow;
} }
float Shadow_DoBilinear_2x2(in SHADOWMAP tex, in vec4 projCoord){ float Shadow_DoBilinear_2x2(in SHADOWMAP tex, in vec4 projCoord){
float border = Shadow_BorderCheck(projCoord.xy); float border = Shadow_BorderCheck(projCoord.xy);
if (border > 0.0) if (border > 0.0)
return 1.0; return 1.0;
vec4 gather = vec4(0.0); vec4 gather = vec4(0.0);
gather.x = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(0.0, 0.0)); gather.x = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(0.0, 0.0));
gather.y = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(1.0, 0.0)); gather.y = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(1.0, 0.0));
gather.z = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(0.0, 1.0)); gather.z = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(0.0, 1.0));
gather.w = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(1.0, 1.0)); gather.w = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(1.0, 1.0));
vec2 f = fract( projCoord.xy * texSize ); vec2 f = fract( projCoord.xy * texSize );
vec2 mx = mix( gather.xz, gather.yw, f.x ); vec2 mx = mix( gather.xz, gather.yw, f.x );
return mix( mx.x, mx.y, f.y ); return mix( mx.x, mx.y, f.y );
} }
float Shadow_DoPCF(in SHADOWMAP tex, in vec4 projCoord){ float Shadow_DoPCF(in SHADOWMAP tex, in vec4 projCoord){
float shadow = 0.0; float shadow = 0.0;
float border = Shadow_BorderCheck(projCoord.xy); float border = Shadow_BorderCheck(projCoord.xy);
if (border > 0.0) if (border > 0.0)
return 1.0; return 1.0;
float bound = KERNEL * 0.5 - 0.5; float bound = KERNEL * 0.5 - 0.5;
bound *= PCFEDGE; bound *= PCFEDGE;
for (float y = -bound; y <= bound; y += PCFEDGE){ for (float y = -bound; y <= bound; y += PCFEDGE){
for (float x = -bound; x <= bound; x += PCFEDGE){ for (float x = -bound; x <= bound; x += PCFEDGE){
shadow += clamp(Shadow_DoShadowCompareOffset(tex,projCoord,vec2(x,y)) + shadow += clamp(Shadow_DoShadowCompareOffset(tex,projCoord,vec2(x,y)) +
border, border,
0.0, 1.0); 0.0, 1.0);
} }
} }
shadow = shadow / (KERNEL * KERNEL); shadow = shadow / (KERNEL * KERNEL);
return shadow; return shadow;
} }
#ifdef DISCARD_ALPHA #ifdef DISCARD_ALPHA
#ifdef COLOR_MAP #ifdef COLOR_MAP
uniform sampler2D m_ColorMap; uniform sampler2D m_ColorMap;
#else #else
uniform sampler2D m_DiffuseMap; uniform sampler2D m_DiffuseMap;
#endif #endif
uniform float m_AlphaDiscardThreshold; uniform float m_AlphaDiscardThreshold;
varying vec2 texCoord; varying vec2 texCoord;
#endif #endif
void main(){ void main(){
#ifdef DISCARD_ALPHA #ifdef DISCARD_ALPHA
#ifdef COLOR_MAP #ifdef COLOR_MAP
float alpha = texture2D(m_ColorMap,texCoord).a; float alpha = texture2D(m_ColorMap,texCoord).a;
#else #else
float alpha = texture2D(m_DiffuseMap,texCoord).a; float alpha = texture2D(m_DiffuseMap,texCoord).a;
#endif #endif
if(alpha<=m_AlphaDiscardThreshold){ if(alpha<=m_AlphaDiscardThreshold){
discard; discard;
} }
#endif #endif
vec4 shadowPerSplit = vec4(0.0); vec4 shadowPerSplit = vec4(0.0);
shadowPerSplit.x = GETSHADOW(m_ShadowMap0, projCoord0); shadowPerSplit.x = GETSHADOW(m_ShadowMap0, projCoord0);
shadowPerSplit.y = GETSHADOW(m_ShadowMap1, projCoord1); shadowPerSplit.y = GETSHADOW(m_ShadowMap1, projCoord1);
shadowPerSplit.z = GETSHADOW(m_ShadowMap2, projCoord2); shadowPerSplit.z = GETSHADOW(m_ShadowMap2, projCoord2);
shadowPerSplit.w = GETSHADOW(m_ShadowMap3, projCoord3); shadowPerSplit.w = GETSHADOW(m_ShadowMap3, projCoord3);
vec4 less = step( shadowPosition, m_Splits ); vec4 less = step( shadowPosition, m_Splits );
vec4 more = vec4(1.0) - step( shadowPosition, vec4(0.0, m_Splits.xyz) ); vec4 more = vec4(1.0) - step( shadowPosition, vec4(0.0, m_Splits.xyz) );
float shadow = dot(shadowPerSplit, less * more ); float shadow = dot(shadowPerSplit, less * more );
shadow = shadow * m_ShadowIntensity + (1.0 - m_ShadowIntensity); shadow = shadow * m_ShadowIntensity + (1.0 - m_ShadowIntensity);
gl_FragColor = vec4(shadow, shadow, shadow, 1.0); gl_FragColor = vec4(shadow, shadow, shadow, 1.0);
//gl_FragColor = vec4(alpha, alpha, alpha, 1.0); //gl_FragColor = vec4(alpha, alpha, alpha, 1.0);
} }

Loading…
Cancel
Save