Fixed 2 issues with shadows :
- Looks like Poly offset behave defferently between ATI and NVIDIA i added a bit of offset to avoid shadow acne for NVIDIA - Added a flag needCompareModeUpdate in the Texture class to avoid setting it on every frame in the renderer. I changed Lwjgl and Jogl renderer accordingly. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10043 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
		
							parent
							
								
									7e43015f3c
								
							
						
					
					
						commit
						01bf1ca843
					
				| @ -192,7 +192,7 @@ MaterialDef Phong Lighting { | ||||
|             FaceCull Off | ||||
|             DepthTest On | ||||
|             DepthWrite On | ||||
|             PolyOffset 5 0 | ||||
|             PolyOffset 5 3 | ||||
|             ColorWrite Off | ||||
|         } | ||||
| 
 | ||||
|  | ||||
| @ -12,7 +12,7 @@ MaterialDef Pre Shadow { | ||||
|             FaceCull Off | ||||
|             DepthTest On | ||||
|             DepthWrite On | ||||
|             PolyOffset 5 0 | ||||
|             PolyOffset 5 3 | ||||
|             ColorWrite Off | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -298,6 +298,7 @@ public abstract class Texture implements CloneableSmartAsset, Savable, Cloneable | ||||
|     private MinFilter minificationFilter = MinFilter.BilinearNoMipMaps; | ||||
|     private MagFilter magnificationFilter = MagFilter.Bilinear; | ||||
|     private ShadowCompareMode shadowCompareMode = ShadowCompareMode.Off; | ||||
|     private boolean needCompareModeUpdate = false; | ||||
|     private int anisotropicFilter; | ||||
| 
 | ||||
|     /** | ||||
| @ -385,6 +386,7 @@ public abstract class Texture implements CloneableSmartAsset, Savable, Cloneable | ||||
|                     "compareMode can not be null."); | ||||
|         } | ||||
|         this.shadowCompareMode = compareMode; | ||||
|         needCompareModeUpdate = true; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
| @ -619,4 +621,14 @@ public abstract class Texture implements CloneableSmartAsset, Savable, Cloneable | ||||
|         magnificationFilter = capsule.readEnum("magnificationFilter", | ||||
|                 MagFilter.class, MagFilter.Bilinear); | ||||
|     } | ||||
| 
 | ||||
|     public boolean isNeedCompareModeUpdate() { | ||||
|         return needCompareModeUpdate; | ||||
|     } | ||||
| 
 | ||||
|     public void compareModeUpdated() { | ||||
|         this.needCompareModeUpdate = false; | ||||
|     } | ||||
|      | ||||
|      | ||||
| } | ||||
| @ -1813,15 +1813,21 @@ public class JoglRenderer implements Renderer { | ||||
|                 throw new UnsupportedOperationException("Unknown texture type: " + tex.getType()); | ||||
|         } | ||||
| 
 | ||||
|         // R to Texture compare mode | ||||
|         if (tex.getShadowCompareMode() != Texture.ShadowCompareMode.Off) { | ||||
|             gl.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_MODE, GL2.GL_COMPARE_R_TO_TEXTURE); | ||||
|             gl.glTexParameteri(target, GL2.GL_DEPTH_TEXTURE_MODE, GL2.GL_INTENSITY); | ||||
|             if (tex.getShadowCompareMode() == Texture.ShadowCompareMode.GreaterOrEqual) { | ||||
|                 gl.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_FUNC, GL.GL_GEQUAL); | ||||
|         if (tex.isNeedCompareModeUpdate()) { | ||||
|             // R to Texture compare mode | ||||
|             if (tex.getShadowCompareMode() != Texture.ShadowCompareMode.Off) { | ||||
|                 gl.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_MODE, GL2.GL_COMPARE_R_TO_TEXTURE); | ||||
|                 gl.glTexParameteri(target, GL2.GL_DEPTH_TEXTURE_MODE, GL2.GL_INTENSITY); | ||||
|                 if (tex.getShadowCompareMode() == Texture.ShadowCompareMode.GreaterOrEqual) { | ||||
|                     gl.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_FUNC, GL.GL_GEQUAL); | ||||
|                 } else { | ||||
|                     gl.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_FUNC, GL.GL_LEQUAL); | ||||
|                 } | ||||
|             } else { | ||||
|                 gl.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_FUNC, GL.GL_LEQUAL); | ||||
|                 //restoring default value | ||||
|                 gl.glTexParameteri(target, GL2.GL_TEXTURE_COMPARE_MODE, GL2.GL_NONE); | ||||
|             } | ||||
|             tex.compareModeUpdated(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -1764,15 +1764,21 @@ public class LwjglRenderer implements Renderer { | ||||
|                 throw new UnsupportedOperationException("Unknown texture type: " + tex.getType()); | ||||
|         } | ||||
| 
 | ||||
|         // R to Texture compare mode | ||||
|         if (tex.getShadowCompareMode() != Texture.ShadowCompareMode.Off) { | ||||
|             glTexParameteri(target, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); | ||||
|             glTexParameteri(target, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY); | ||||
|             if (tex.getShadowCompareMode() == Texture.ShadowCompareMode.GreaterOrEqual) { | ||||
|                 glTexParameteri(target, GL_TEXTURE_COMPARE_FUNC, GL_GEQUAL); | ||||
|             } else { | ||||
|                 glTexParameteri(target, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); | ||||
|         if(tex.isNeedCompareModeUpdate()){ | ||||
|             // R to Texture compare mode | ||||
|             if (tex.getShadowCompareMode() != Texture.ShadowCompareMode.Off) { | ||||
|                 glTexParameteri(target, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); | ||||
|                 glTexParameteri(target, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);             | ||||
|                 if (tex.getShadowCompareMode() == Texture.ShadowCompareMode.GreaterOrEqual) { | ||||
|                     glTexParameteri(target, GL_TEXTURE_COMPARE_FUNC, GL_GEQUAL); | ||||
|                 } else { | ||||
|                     glTexParameteri(target, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); | ||||
|                 } | ||||
|             }else{ | ||||
|                  //restoring default value | ||||
|                  glTexParameteri(target, GL_TEXTURE_COMPARE_MODE, GL_NONE);           | ||||
|             } | ||||
|             tex.compareModeUpdated(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user