Skip to content

Commit ecd2510

Browse files
authored
break the sp lighting loop early in modern gl(es) (#2655)
1 parent 402a009 commit ecd2510

File tree

7 files changed

+35
-1
lines changed

7 files changed

+35
-1
lines changed

jme3-core/src/main/java/com/jme3/material/logic/SinglePassAndImageBasedLightingLogic.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ protected int updateLightListUniforms(Shader shader, Geometry g, LightList light
123123

124124
Uniform lightData = shader.getUniform("g_LightData");
125125
lightData.setVector4Length(numLights * 3);//8 lights * max 3
126+
Uniform lightCount = shader.getUniform("g_LightCount");
126127
Uniform ambientColor = shader.getUniform("g_AmbientLightColor");
127128

128129
// Matrix4f
@@ -231,6 +232,7 @@ protected int updateLightListUniforms(Shader shader, Geometry g, LightList light
231232
}
232233
}
233234
vars.release();
235+
lightCount.setValue(VarType.Int, lightDataIndex / 3);
234236

235237
// pad unused buffer space
236238
while (lightDataIndex < numLights * 3) {

jme3-core/src/main/java/com/jme3/material/logic/SinglePassLightingLogic.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ protected int updateLightListUniforms(Shader shader, Geometry g, LightList light
113113

114114
Uniform lightData = shader.getUniform("g_LightData");
115115
lightData.setVector4Length(numLights * 3);//8 lights * max 3
116+
Uniform lightCount = shader.getUniform("g_LightCount");
116117
Uniform ambientColor = shader.getUniform("g_AmbientLightColor");
117118

118119
if (startIndex != 0) {
@@ -198,6 +199,7 @@ protected int updateLightListUniforms(Shader shader, Geometry g, LightList light
198199
}
199200
}
200201
vars.release();
202+
lightCount.setValue(VarType.Int, lightDataIndex / 3);
201203
// pad unused buffer space
202204
while (lightDataIndex < numLights * 3) {
203205
lightData.setVector4InArray(0f, 0f, 0f, 0f, lightDataIndex);

jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#endif
1818

1919
uniform vec4 g_LightData[NB_LIGHTS];
20+
uniform int g_LightCount;
2021
uniform vec3 g_CameraPosition;
2122

2223
#ifdef USE_FOG
@@ -38,6 +39,11 @@ void main(){
3839

3940
// Calculate direct lights
4041
for(int i = 0;i < NB_LIGHTS; i+=3){
42+
#if (defined(GL_ES) && __VERSION__ >= 300) || (!defined(GL_ES) && __VERSION__ >= 150)
43+
if(i >= g_LightCount * 3){
44+
break;
45+
}
46+
#endif
4147
vec4 lightData0 = g_LightData[i];
4248
vec4 lightData1 = g_LightData[i+1];
4349
vec4 lightData2 = g_LightData[i+2];

jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.frag

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ varying vec3 SpecularSum;
3838
#ifndef VERTEX_LIGHTING
3939
uniform mat4 g_ViewMatrix;
4040
uniform vec4 g_LightData[NB_LIGHTS];
41+
uniform int g_LightCount;
4142
varying vec3 vPos;
4243
#endif
4344

@@ -200,6 +201,11 @@ void main(){
200201
#endif
201202

202203
for( int i = 0;i < NB_LIGHTS; i+=3){
204+
#if (defined(GL_ES) && __VERSION__ >= 300) || (!defined(GL_ES) && __VERSION__ >= 150)
205+
if(i >= g_LightCount * 3){
206+
break;
207+
}
208+
#endif
203209
vec4 lightColor = g_LightData[i];
204210
vec4 lightData1 = g_LightData[i+1];
205211
vec4 lightDir;

jme3-core/src/main/resources/Common/MatDefs/Light/SPLighting.vert

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ uniform float m_Shininess;
2121

2222
#if defined(VERTEX_LIGHTING)
2323
uniform vec4 g_LightData[NB_LIGHTS];
24+
uniform int g_LightCount;
2425
#endif
2526
uniform vec4 g_AmbientLightColor;
2627
varying vec2 texCoord;
@@ -148,6 +149,11 @@ void main(){
148149
vec4 diffuseColor;
149150
vec3 specularColor;
150151
for (int i =0;i < NB_LIGHTS; i+=3){
152+
#if (defined(GL_ES) && __VERSION__ >= 300) || (!defined(GL_ES) && __VERSION__ >= 150)
153+
if(i >= g_LightCount * 3){
154+
break;
155+
}
156+
#endif
151157
vec4 lightColor = g_LightData[i];
152158
vec4 lightData1 = g_LightData[i+1];
153159
#ifdef MATERIAL_COLORS
@@ -197,4 +203,4 @@ void main(){
197203
#ifdef USE_FOG
198204
fog_distance = distance(g_CameraPosition, (TransformWorld(modelSpacePos)).xyz);
199205
#endif
200-
}
206+
}

jme3-terrain/src/main/resources/Common/MatDefs/Terrain/AdvancedPBRTerrain.frag

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
//declare PBR Lighting vars
2020
uniform vec4 g_LightData[NB_LIGHTS];
21+
uniform int g_LightCount;
2122
uniform vec3 g_CameraPosition;
2223

2324
#ifdef DEBUG_VALUES_MODE
@@ -133,6 +134,11 @@ void main(){
133134

134135
// Calculate direct lights
135136
for(int i = 0;i < NB_LIGHTS; i+=3){
137+
#if (defined(GL_ES) && __VERSION__ >= 300) || (!defined(GL_ES) && __VERSION__ >= 150)
138+
if(i >= g_LightCount * 3){
139+
break;
140+
}
141+
#endif
136142
vec4 lightData0 = g_LightData[i];
137143
vec4 lightData1 = g_LightData[i+1];
138144
vec4 lightData2 = g_LightData[i+2];

jme3-terrain/src/main/resources/Common/MatDefs/Terrain/SPTerrainLighting.frag

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ varying vec4 SpecularSum;
1010

1111
uniform mat4 g_ViewMatrix;
1212
uniform vec4 g_LightData[NB_LIGHTS];
13+
uniform int g_LightCount;
1314
varying vec3 vTangent;
1415
varying vec3 vBinormal;
1516
varying vec3 vPos;
@@ -623,6 +624,11 @@ void main(){
623624
//-----------------------
624625
gl_FragColor = AmbientSum * diffuseColor;
625626
for( int i = 0;i < NB_LIGHTS; i+=3){
627+
#if (defined(GL_ES) && __VERSION__ >= 300) || (!defined(GL_ES) && __VERSION__ >= 150)
628+
if(i >= g_LightCount * 3){
629+
break;
630+
}
631+
#endif
626632
vec4 lightColor = g_LightData[i];
627633
vec4 lightData1 = g_LightData[i+1];
628634
vec4 lightDir;

0 commit comments

Comments
 (0)