diff --git a/jme3-core/src/main/java/com/jme3/material/logic/SinglePassAndImageBasedLightingLogic.java b/jme3-core/src/main/java/com/jme3/material/logic/SinglePassAndImageBasedLightingLogic.java index 8e38f2e6ca..eee7eedbac 100644 --- a/jme3-core/src/main/java/com/jme3/material/logic/SinglePassAndImageBasedLightingLogic.java +++ b/jme3-core/src/main/java/com/jme3/material/logic/SinglePassAndImageBasedLightingLogic.java @@ -123,6 +123,7 @@ protected int updateLightListUniforms(Shader shader, Geometry g, LightList light Uniform lightData = shader.getUniform("g_LightData"); lightData.setVector4Length(numLights * 3);//8 lights * max 3 + Uniform lightCount = shader.getUniform("g_LightCount"); Uniform ambientColor = shader.getUniform("g_AmbientLightColor"); // Matrix4f @@ -231,6 +232,7 @@ protected int updateLightListUniforms(Shader shader, Geometry g, LightList light } } vars.release(); + lightCount.setValue(VarType.Int, lightDataIndex / 3); // pad unused buffer space while (lightDataIndex < numLights * 3) { diff --git a/jme3-core/src/main/java/com/jme3/material/logic/SinglePassLightingLogic.java b/jme3-core/src/main/java/com/jme3/material/logic/SinglePassLightingLogic.java index 58240569ef..bf0eeee95e 100644 --- a/jme3-core/src/main/java/com/jme3/material/logic/SinglePassLightingLogic.java +++ b/jme3-core/src/main/java/com/jme3/material/logic/SinglePassLightingLogic.java @@ -113,6 +113,7 @@ protected int updateLightListUniforms(Shader shader, Geometry g, LightList light Uniform lightData = shader.getUniform("g_LightData"); lightData.setVector4Length(numLights * 3);//8 lights * max 3 + Uniform lightCount = shader.getUniform("g_LightCount"); Uniform ambientColor = shader.getUniform("g_AmbientLightColor"); if (startIndex != 0) { @@ -198,6 +199,7 @@ protected int updateLightListUniforms(Shader shader, Geometry g, LightList light } } vars.release(); + lightCount.setValue(VarType.Int, lightDataIndex / 3); // pad unused buffer space while (lightDataIndex < numLights * 3) { lightData.setVector4InArray(0f, 0f, 0f, 0f, lightDataIndex); diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag index c6630a0fa0..d10d795ab7 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag +++ b/jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag @@ -17,6 +17,7 @@ #endif uniform vec4 g_LightData[NB_LIGHTS]; +uniform int g_LightCount; uniform vec3 g_CameraPosition; #ifdef USE_FOG @@ -38,6 +39,11 @@ void main(){ // Calculate direct lights for(int i = 0;i < NB_LIGHTS; i+=3){ + #if (defined(GL_ES) && __VERSION__ >= 300) || (!defined(GL_ES) && __VERSION__ >= 150) + if(i >= g_LightCount * 3){ + break; + } + #endif vec4 lightData0 = g_LightData[i]; vec4 lightData1 = g_LightData[i+1]; vec4 lightData2 = g_LightData[i+2]; diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.frag b/jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.frag index 028ab44e89..cb3f9e6c83 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.frag +++ b/jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.frag @@ -38,6 +38,7 @@ varying vec3 SpecularSum; #ifndef VERTEX_LIGHTING uniform mat4 g_ViewMatrix; uniform vec4 g_LightData[NB_LIGHTS]; + uniform int g_LightCount; varying vec3 vPos; #endif @@ -197,6 +198,11 @@ void main(){ #endif for( int i = 0;i < NB_LIGHTS; i+=3){ + #if (defined(GL_ES) && __VERSION__ >= 300) || (!defined(GL_ES) && __VERSION__ >= 150) + if(i >= g_LightCount * 3){ + break; + } + #endif vec4 lightColor = g_LightData[i]; vec4 lightData1 = g_LightData[i+1]; vec4 lightDir; diff --git a/jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.vert b/jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.vert index b16554a6e4..b46f4eab59 100644 --- a/jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.vert +++ b/jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.vert @@ -21,6 +21,7 @@ uniform float m_Shininess; #if defined(VERTEX_LIGHTING) uniform vec4 g_LightData[NB_LIGHTS]; + uniform int g_LightCount; #endif uniform vec4 g_AmbientLightColor; varying vec2 texCoord; @@ -148,6 +149,11 @@ void main(){ vec4 diffuseColor; vec3 specularColor; for (int i =0;i < NB_LIGHTS; i+=3){ + #if (defined(GL_ES) && __VERSION__ >= 300) || (!defined(GL_ES) && __VERSION__ >= 150) + if(i >= g_LightCount * 3){ + break; + } + #endif vec4 lightColor = g_LightData[i]; vec4 lightData1 = g_LightData[i+1]; #ifdef MATERIAL_COLORS @@ -197,4 +203,4 @@ void main(){ #ifdef USE_FOG fog_distance = distance(g_CameraPosition, (TransformWorld(modelSpacePos)).xyz); #endif -} \ No newline at end of file +} diff --git a/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/AdvancedPBRTerrain.frag b/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/AdvancedPBRTerrain.frag index 9cad93f886..7da7d5e503 100644 --- a/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/AdvancedPBRTerrain.frag +++ b/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/AdvancedPBRTerrain.frag @@ -18,6 +18,7 @@ //declare PBR Lighting vars uniform vec4 g_LightData[NB_LIGHTS]; +uniform int g_LightCount; uniform vec3 g_CameraPosition; #ifdef DEBUG_VALUES_MODE @@ -133,6 +134,11 @@ void main(){ // Calculate direct lights for(int i = 0;i < NB_LIGHTS; i+=3){ + #if (defined(GL_ES) && __VERSION__ >= 300) || (!defined(GL_ES) && __VERSION__ >= 150) + if(i >= g_LightCount * 3){ + break; + } + #endif vec4 lightData0 = g_LightData[i]; vec4 lightData1 = g_LightData[i+1]; vec4 lightData2 = g_LightData[i+2]; diff --git a/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/SPTerrainLighting.frag b/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/SPTerrainLighting.frag index 426b665e94..15b6f761af 100644 --- a/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/SPTerrainLighting.frag +++ b/jme3-terrain/src/main/resources/Common/MatDefs/Terrain/SPTerrainLighting.frag @@ -10,6 +10,7 @@ varying vec4 SpecularSum; uniform mat4 g_ViewMatrix; uniform vec4 g_LightData[NB_LIGHTS]; +uniform int g_LightCount; varying vec3 vTangent; varying vec3 vBinormal; varying vec3 vPos; @@ -620,6 +621,11 @@ void main(){ //----------------------- gl_FragColor = AmbientSum * diffuseColor; for( int i = 0;i < NB_LIGHTS; i+=3){ + #if (defined(GL_ES) && __VERSION__ >= 300) || (!defined(GL_ES) && __VERSION__ >= 150) + if(i >= g_LightCount * 3){ + break; + } + #endif vec4 lightColor = g_LightData[i]; vec4 lightData1 = g_LightData[i+1]; vec4 lightDir;