Shadows/SSAO and transparency : Removed the AlphaDiscardThreshold attribute from the lighting material. Transparency discarding is now handled by the AlphaFallOff render state (as it should be).

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@9330 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
rem..om 13 years ago
parent 8de8bf2d3e
commit 22edb7beb0
  1. 18
      engine/src/core-data/Common/MatDefs/Light/Lighting.j3md
  2. 33
      engine/src/core-data/Common/MatDefs/Shadow/PostShadowPSSM.frag
  3. 4
      engine/src/core-data/Common/MatDefs/Shadow/PostShadowPSSM.j3md
  4. 4
      engine/src/core-data/Common/MatDefs/Shadow/PostShadowPSSM.vert
  5. 33
      engine/src/core-data/Common/MatDefs/Shadow/PostShadowPSSM15.frag
  6. 35
      engine/src/core-data/Common/MatDefs/Shadow/PreShadow.frag
  7. 6
      engine/src/core-effects/Common/MatDefs/SSAO/normal.frag
  8. 3
      engine/src/core-effects/Common/MatDefs/SSAO/ssao15.frag
  9. 12
      engine/src/core/com/jme3/shadow/PssmShadowRenderer.java
  10. 1
      engine/test-data/Models/Tree/Leaves.j3m

@ -15,9 +15,6 @@ MaterialDef Phong Lighting {
// Output alpha from the diffuse map // Output alpha from the diffuse map
Boolean UseAlpha Boolean UseAlpha
// Apha threshold for fragment discarding
Float AlphaDiscardThreshold
// Normal map is in BC5/ATI2n/LATC/3Dc compression format // Normal map is in BC5/ATI2n/LATC/3Dc compression format
Boolean LATC Boolean LATC
@ -160,7 +157,7 @@ MaterialDef Phong Lighting {
SEPARATE_TEXCOORD : SeparateTexCoord SEPARATE_TEXCOORD : SeparateTexCoord
USE_REFLECTION : EnvMap USE_REFLECTION : EnvMap
SPHERE_MAP : SphereMap SPHERE_MAP : EnvMapAsSphereMap
} }
} }
@ -175,8 +172,7 @@ MaterialDef Phong Lighting {
} }
Defines { Defines {
COLOR_MAP : ColorMap DIFFUSEMAP : DiffuseMap
DISCARD_ALPHA : AlphaDiscardThreshold
} }
RenderState { RenderState {
@ -203,12 +199,11 @@ MaterialDef Phong Lighting {
HARDWARE_SHADOWS : HardwareShadows HARDWARE_SHADOWS : HardwareShadows
FILTER_MODE : FilterMode FILTER_MODE : FilterMode
PCFEDGE : PCFEdge PCFEDGE : PCFEdge
DISCARD_ALPHA : AlphaDiscardThreshold DIFFUSEMAP : DiffuseMap
COLOR_MAP : ColorMap
} }
RenderState { RenderState {
Blend Modulate Blend Alpha
} }
} }
@ -225,12 +220,11 @@ MaterialDef Phong Lighting {
HARDWARE_SHADOWS : HardwareShadows HARDWARE_SHADOWS : HardwareShadows
FILTER_MODE : FilterMode FILTER_MODE : FilterMode
PCFEDGE : PCFEdge PCFEDGE : PCFEdge
DISCARD_ALPHA : AlphaDiscardThreshold DIFFUSEMAP : DiffuseMap
COLOR_MAP : ColorMap
} }
RenderState { RenderState {
Blend Modulate Blend Alpha
} }
} }

@ -114,28 +114,24 @@ float Shadow_DoPCF(in SHADOWMAP tex, in vec4 projCoord){
return shadow; return shadow;
} }
#ifdef DISCARD_ALPHA #ifdef COLOR_MAP
#ifdef COLOR_MAP uniform sampler2D m_ColorMap;
uniform sampler2D m_ColorMap; varying vec2 texCoord;
#else #endif
uniform sampler2D m_DiffuseMap; #ifdef DIFFUSEMAP
#endif uniform sampler2D m_DiffuseMap;
uniform float m_AlphaDiscardThreshold;
varying vec2 texCoord; varying vec2 texCoord;
#endif #endif
void main(){ void main(){
#ifdef DISCARD_ALPHA float alpha =1.0;
#ifdef COLOR_MAP
float alpha = texture2D(m_ColorMap,texCoord).a;
#else
float alpha = texture2D(m_DiffuseMap,texCoord).a;
#endif
if(alpha<=m_AlphaDiscardThreshold){
discard;
}
#ifdef COLOR_MAP
alpha = texture2D(m_ColorMap,texCoord).a;
#endif
#ifdef DIFFUSEMAP
alpha = texture2D(m_DiffuseMap,texCoord).a;
#endif #endif
@ -151,9 +147,6 @@ void main(){
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(0.0, 0.0, 0.0, min(1.0 - shadow,alpha));
gl_FragColor = vec4(shadow, shadow, shadow, 1.0);
//gl_FragColor = vec4(alpha, alpha, alpha, 1.0);
} }

@ -36,7 +36,7 @@ MaterialDef Post Shadow {
} }
RenderState { RenderState {
Blend Modulate Blend Alpha
} }
} }
@ -56,7 +56,7 @@ MaterialDef Post Shadow {
} }
RenderState { RenderState {
Blend Modulate Blend Alpha
} }
} }

@ -16,7 +16,7 @@ varying float shadowPosition;
varying vec2 texCoord; varying vec2 texCoord;
attribute vec3 inPosition; attribute vec3 inPosition;
#ifdef DISCARD_ALPHA #ifdef DIFFUSEMAP) || defined(COLOR_MAP)
attribute vec2 inTexCoord; attribute vec2 inTexCoord;
#endif #endif
@ -33,7 +33,7 @@ void main(){
// get the vertex in world space // get the vertex in world space
vec4 worldPos = g_WorldMatrix * vec4(inPosition, 1.0); vec4 worldPos = g_WorldMatrix * vec4(inPosition, 1.0);
#ifdef DISCARD_ALPHA #if defined(DIFFUSEMAP) || defined(COLOR_MAP)
texCoord = inTexCoord; texCoord = inTexCoord;
#endif #endif
// populate the light view matrices array and convert vertex to light viewProj space // populate the light view matrices array and convert vertex to light viewProj space

@ -120,31 +120,28 @@ float Shadow_DoPCF(in SHADOWMAP tex, in vec4 projCoord){
return shadow; return shadow;
} }
#ifdef DISCARD_ALPHA
#ifdef COLOR_MAP #ifdef COLOR_MAP
uniform sampler2D m_ColorMap; uniform sampler2D m_ColorMap;
#else varying vec2 texCoord;
uniform sampler2D m_DiffuseMap; #endif
#endif #ifdef DIFFUSEMAP
uniform float m_AlphaDiscardThreshold; uniform sampler2D m_DiffuseMap;
varying vec2 texCoord; varying vec2 texCoord;
#endif #endif
void main(){ void main(){
float shadow = 0.0; float shadow = 0.0;
float alpha = 1.0;
#ifdef DISCARD_ALPHA #ifdef COLOR_MAP
#ifdef COLOR_MAP alpha = texture2D(m_ColorMap,texCoord).a;
float alpha = texture2D(m_ColorMap,texCoord).a;
#else
float alpha = texture2D(m_DiffuseMap,texCoord).a;
#endif
if(alpha < m_AlphaDiscardThreshold){
discard;
}
#endif #endif
#ifdef DIFFUSEMAP
alpha = texture2D(m_DiffuseMap,texCoord).a;
#endif
if(shadowPosition < m_Splits.x){ if(shadowPosition < m_Splits.x){
shadow = GETSHADOW(m_ShadowMap0, projCoord0); shadow = GETSHADOW(m_ShadowMap0, projCoord0);
}else if( shadowPosition < m_Splits.y){ }else if( shadowPosition < m_Splits.y){
@ -156,6 +153,6 @@ void main(){
} }
shadow = shadow * m_ShadowIntensity + (1.0 - m_ShadowIntensity); shadow = shadow * m_ShadowIntensity + (1.0 - m_ShadowIntensity);
outFragColor = vec4(shadow, shadow, shadow, 1.0); outFragColor = vec4(0.0, 0.0, 0.0, min(1.0 - shadow,alpha));
} }

@ -1,27 +1,24 @@
varying vec2 texCoord; varying vec2 texCoord;
#ifdef DISCARD_ALPHA
#ifdef COLOR_MAP #ifdef COLOR_MAP
uniform sampler2D m_ColorMap; uniform sampler2D m_ColorMap;
#else #endif
uniform sampler2D m_DiffuseMap; #ifdef DIFFUSEMAP
#endif uniform sampler2D m_DiffuseMap;
uniform float m_AlphaDiscardThreshold;
#endif #endif
void main(){ void main(){
#ifdef DISCARD_ALPHA float a = 1.0;
#ifdef COLOR_MAP
if (texture2D(m_ColorMap, texCoord).a <= m_AlphaDiscardThreshold){ #ifdef COLOR_MAP
discard; a = texture2D(m_ColorMap, texCoord).a;
} #endif
#else #ifdef DIFFUSEMAP
if (texture2D(m_DiffuseMap, texCoord).a <= m_AlphaDiscardThreshold){ a = texture2D(m_DiffuseMap, texCoord).a;
discard; #endif
}
#endif
#endif
gl_FragColor = vec4(1.0); gl_FragColor = vec4(a);
} }

@ -11,11 +11,9 @@ void main(void)
{ {
#ifdef DIFFUSEMAP_ALPHA #ifdef DIFFUSEMAP_ALPHA
if(texture2D(m_DiffuseMap,texCoord).a<m_AlphaDiscardThreshold){ float alpha=texture2D(m_DiffuseMap,texCoord).a;
discard;
}
#endif #endif
gl_FragColor = vec4(normal.xy* 0.5 + 0.5,-normal.z* 0.5 + 0.5, 1.0); gl_FragColor = vec4(normal.xy* 0.5 + 0.5,-normal.z* 0.5 + 0.5, alpha);
} }

@ -57,12 +57,10 @@ vec2 reflection(in vec2 v1,in vec2 v2){
} }
//const vec2 vec[4] = vec2[4](vec2(1.0,0.0), vec2(-1.0,0.0), vec2(0.0,1.0), vec2(0.0,-1.0));
void main(){ void main(){
float result; float result;
//vec2 vec[4] = { vec2(1.0, 0.0), vec2(-1.0, 0.0), vec2(0.0, 1.0), vec2(0.0, -1.0) };
vec3 position = getPosition(texCoord); vec3 position = getPosition(texCoord);
//optimization, do not calculate AO if depth is 1 //optimization, do not calculate AO if depth is 1
if(depthv==1.0){ if(depthv==1.0){
@ -91,6 +89,5 @@ void main(){
result = 1.0-ao; result = 1.0-ao;
gl_FragColor=vec4(result,result,result, 1.0); gl_FragColor=vec4(result,result,result, 1.0);
//gl_FragColor=vec4(depthv,depthv,depthv, 1.0);
} }

@ -142,8 +142,6 @@ public class PssmShadowRenderer implements SceneProcessor {
private Picture[] dispPic; private Picture[] dispPic;
private Vector3f[] points = new Vector3f[8]; private Vector3f[] points = new Vector3f[8];
private boolean flushQueues = true; private boolean flushQueues = true;
//render state for post shadow pass
private RenderState state = new RenderState();
// define if the fallback material should be used. // define if the fallback material should be used.
private boolean needsfallBackMaterial = false; private boolean needsfallBackMaterial = false;
//Name of the post material technique //Name of the post material technique
@ -217,12 +215,6 @@ public class PssmShadowRenderer implements SceneProcessor {
points[i] = new Vector3f(); points[i] = new Vector3f();
} }
//initializing render state for post shadow pass (modulade blending and cullmode of for back faces )
state.setBlendMode(RenderState.BlendMode.Modulate);
state.setFaceCullMode(RenderState.FaceCullMode.Off);
state.setDepthWrite(false);
state.setPolyOffset(-0.1f, 0);
} }
/** /**
@ -458,9 +450,8 @@ public class PssmShadowRenderer implements SceneProcessor {
renderManager.setForcedMaterial(postshadowMat); renderManager.setForcedMaterial(postshadowMat);
} }
//forcing the post shadow technique and render state //forcing the post shadow technique
renderManager.setForcedTechnique(postTechniqueName); renderManager.setForcedTechnique(postTechniqueName);
renderManager.setForcedRenderState(state);
//rendering the post shadow pass //rendering the post shadow pass
viewPort.getQueue().renderShadowQueue(ShadowMode.Receive, renderManager, cam, flushQueues); viewPort.getQueue().renderShadowQueue(ShadowMode.Receive, renderManager, cam, flushQueues);
@ -468,7 +459,6 @@ public class PssmShadowRenderer implements SceneProcessor {
//resetting renderManager settings //resetting renderManager settings
renderManager.setForcedTechnique(null); renderManager.setForcedTechnique(null);
renderManager.setForcedMaterial(null); renderManager.setForcedMaterial(null);
renderManager.setForcedRenderState(null);
renderManager.setCamera(cam, false); renderManager.setCamera(cam, false);
} }

@ -5,7 +5,6 @@ Material Leaves : Common/MatDefs/Light/Lighting.j3md {
MaterialParameters { MaterialParameters {
DiffuseMap : Models/Tree/Leaves.png DiffuseMap : Models/Tree/Leaves.png
UseAlpha : true UseAlpha : true
AlphaDiscardThreshold : 0.5
UseMaterialColors : true UseMaterialColors : true
Ambient : .5 .5 .5 .5 Ambient : .5 .5 .5 .5
Diffuse : 0.7 0.7 0.7 1 Diffuse : 0.7 0.7 0.7 1

Loading…
Cancel
Save