Просмотр исходного кода

Use a matrix4 arrayparameter for the LightViewProjectionMatrices

scott 2 недель назад
Родитель
Сommit
fb8f315f1d

+ 1 - 1
jme3-core/src/main/java/com/jme3/shadow/AbstractShadowRenderer.java

@@ -138,7 +138,7 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable,
     // List of geometries that cast shadows (occluders).
     protected GeometryList shadowMapOccluders = new GeometryList(new OpaqueComparator());
     // Internal cache for shadow map uniform names (e.g., "ShadowMap0", "ShadowMap1").
-    private String[] shadowMapStringCache;
+    protected String[] shadowMapStringCache;
     // nternal cache for light view projection matrix uniform names (e.g., "LightViewProjectionMatrix0").
     private String[] lightViewStringCache;
     // The distance at which shadows start to fade out. A value of 0 means no override.

+ 13 - 0
jme3-core/src/main/java/com/jme3/shadow/SdsmDirectionalLightShadowRenderer.java

@@ -428,6 +428,19 @@ public class SdsmDirectionalLightShadowRenderer extends AbstractShadowRenderer {
         material.clearParam("LightDir");
     }
 
+    @Override
+    protected void setPostShadowParams() {
+        setMaterialParameters(postshadowMat);
+        postshadowMat.setParam("LightViewProjectionMatrices", VarType.Matrix4Array, lightViewProjectionsMatrices);
+        for (int j = 0; j < nbShadowMaps; j++) {
+            postshadowMat.setTexture(shadowMapStringCache[j], shadowMaps[j]);
+        }
+        if (fadeInfo != null) {
+            postshadowMat.setVector2("FadeInfo", fadeInfo);
+        }
+        postshadowMat.setBoolean("BackfaceShadows", renderBackFacesShadows);
+    }
+
     @Override
     protected boolean checkCulling(Camera viewCam) {
         // Directional lights are always visible

+ 3 - 11
jme3-core/src/main/resources/Common/MatDefs/Shadow/Sdsm/SdsmPostShadow.frag

@@ -14,10 +14,7 @@ const mat4 biasMat = mat4(0.5, 0.0, 0.0, 0.0,
 0.0, 0.0, 0.5, 0.0,
 0.5, 0.5, 0.5, 1.0);
 
-uniform mat4 m_LightViewProjectionMatrix0;
-uniform mat4 m_LightViewProjectionMatrix1;
-uniform mat4 m_LightViewProjectionMatrix2;
-uniform mat4 m_LightViewProjectionMatrix3;
+uniform mat4 m_LightViewProjectionMatrices[4];
 
 uniform vec2 g_ResolutionInverse;
 
@@ -33,21 +30,16 @@ vec3 getPosition(in float depth, in vec2 uv){
 
 
 float determineShadow(int index, vec4 worldPos){
-    vec4 projCoord;
+    vec4 projCoord = biasMat * m_LightViewProjectionMatrices[index] * worldPos;
     if(index == 0){
-        projCoord = biasMat * m_LightViewProjectionMatrix0 * worldPos;
         return GETSHADOW(m_ShadowMap0, projCoord);
     } else if(index == 1){
-        projCoord = biasMat * m_LightViewProjectionMatrix1 * worldPos;
         return GETSHADOW(m_ShadowMap1, projCoord);
     } else if(index == 2){
-        projCoord = biasMat * m_LightViewProjectionMatrix2 * worldPos;
         return GETSHADOW(m_ShadowMap2, projCoord);
-    } else if(index == 3){
-        projCoord = biasMat * m_LightViewProjectionMatrix3 * worldPos;
+    } else {
         return GETSHADOW(m_ShadowMap3, projCoord);
     }
-    return 1f;
 }
 
 void main() {

+ 1 - 4
jme3-core/src/main/resources/Common/MatDefs/Shadow/Sdsm/SdsmPostShadow.j3md

@@ -17,10 +17,7 @@ MaterialDef Post Shadow {
 
         Vector2 FadeInfo
 
-        Matrix4 LightViewProjectionMatrix0
-        Matrix4 LightViewProjectionMatrix1
-        Matrix4 LightViewProjectionMatrix2
-        Matrix4 LightViewProjectionMatrix3
+        Matrix4Array LightViewProjectionMatrices
 
         Vector3 LightDir