Jelajahi Sumber

Fix compatibility with GL ES. Ensure mipmaps are never recomputed by the engine

Riccardo Balbo 2 tahun lalu
induk
melakukan
e648d6cf58

+ 14 - 8
jme3-core/src/main/java/com/jme3/environment/baker/GenericEnvBaker.java

@@ -153,17 +153,21 @@ public abstract class GenericEnvBaker implements EnvBaker {
 
     @Override
     public void bakeEnvironment(Spatial scene, Vector3f position, float frustumNear, float frustumFar, Function<Geometry, Boolean> filter) {
-        FrameBuffer envbaker = new FrameBuffer(env.getImage().getWidth(), env.getImage().getHeight(), 1);
+        FrameBuffer envbakers[] = new FrameBuffer[6];
+        for (int i = 0; i < 6; i++) {
+            envbakers[i] = new FrameBuffer(env.getImage().getWidth(), env.getImage().getHeight(), 1);
+            envbakers[i].setDepthTarget(FrameBufferTarget.newTarget(depthFormat));
+            envbakers[i].setSrgb(false);
+            envbakers[i].addColorTarget(FrameBufferTarget.newTarget(env).face(TextureCubeMap.Face.values()[i]));
+        }
 
-        envbaker.setDepthTarget(FrameBufferTarget.newTarget(depthFormat));
-        envbaker.setSrgb(false);
+       
 
         if(isTexturePulling())startPulling();
 
-        for (int i = 0; i < 6; i++) envbaker.addColorTarget(FrameBufferTarget.newTarget(env).face(TextureCubeMap.Face.values()[i]));
 
         for (int i = 0; i < 6; i++) {
-            envbaker.setTargetIndex(i);
+            FrameBuffer envbaker = envbakers[i];
 
             ViewPort viewPort = new ViewPort("EnvBaker", getCam(i, envbaker.getWidth(), envbaker.getHeight(), position, frustumNear, frustumFar));
             viewPort.setClearFlags(true, true, true);
@@ -187,8 +191,10 @@ public abstract class GenericEnvBaker implements EnvBaker {
         }
 
         if (isTexturePulling()) endPulling(env);
-        env.getImage().clearUpdateNeeded();           
-        envbaker.dispose();
+        env.getImage().clearUpdateNeeded();
+        for (int i = 0; i < 6; i++) {
+            envbakers[i].dispose();
+        }
     }
     
 
@@ -248,4 +254,4 @@ public abstract class GenericEnvBaker implements EnvBaker {
         tx.getImage().clearUpdateNeeded();
     }
 
-}
+}

+ 10 - 6
jme3-core/src/main/java/com/jme3/environment/baker/IBLGLEnvBaker.java

@@ -123,16 +123,18 @@ public class IBLGLEnvBaker extends GenericEnvBaker implements IBLEnvBaker{
             int mipWidth = (int) (specular.getImage().getWidth() * FastMath.pow(0.5f, mip));
             int mipHeight = (int) (specular.getImage().getHeight() * FastMath.pow(0.5f, mip));
 
-            FrameBuffer specularbaker = new FrameBuffer(mipWidth, mipHeight, 1);
-            specularbaker.setSrgb(false);
-
-            for (int i = 0; i < 6; i++) specularbaker.addColorTarget(FrameBufferTarget.newTarget(specular).level(mip).face(i));
+            FrameBuffer specularbakers[] = new FrameBuffer[6];
+            for (int i = 0; i < 6; i++) {
+                specularbakers[i] = new FrameBuffer(mipWidth, mipHeight, 1);
+                specularbakers[i].setSrgb(false);
+                specularbakers[i].addColorTarget(FrameBufferTarget.newTarget(specular).level(mip).face(i));
+            }
 
             float roughness = (float) mip / (float) (specular.getImage().getMipMapSizes().length - 1);
             mat.setFloat("Roughness", roughness);
 
             for (int i = 0; i < 6; i++) {
-                specularbaker.setTargetIndex(i);
+                FrameBuffer specularbaker = specularbakers[i];
                 mat.setInt("FaceId", i);
 
                 screen.updateLogicalState(0);
@@ -145,7 +147,9 @@ public class IBLGLEnvBaker extends GenericEnvBaker implements IBLEnvBaker{
                 if (isTexturePulling())  pull(specularbaker, specular,i);               
                 
             }
-            specularbaker.dispose();
+            for (int i = 0; i < 6; i++) {
+                specularbakers[i].dispose();
+            }
         }
         
         if (isTexturePulling())endPulling(specular);

+ 15 - 11
jme3-core/src/main/java/com/jme3/environment/baker/IBLGLEnvBakerLight.java

@@ -87,7 +87,7 @@ public class IBLGLEnvBakerLight extends IBLHybridEnvBakerLight {
         
         float remapMaxValue = 0;
         Format format = Format.RGBA32F;
-        if (!renderManager.getRenderer().getCaps().contains(Caps.FloatTexture)) {
+        if (!renderManager.getRenderer().getCaps().contains(Caps.FloatColorBufferRGBA)) {
             LOG.warning("Float textures not supported, using RGB8 instead. This may cause accuracy issues.");
             format = Format.RGBA8;
             remapMaxValue = 0.05f;
@@ -106,10 +106,16 @@ public class IBLGLEnvBakerLight extends IBLHybridEnvBakerLight {
         };
 
 
-        FrameBuffer shbaker = new FrameBuffer(NUM_SH_COEFFICIENT, 1, 1);
-        shbaker.setSrgb(false);
-        shbaker.addColorTarget(FrameBufferTarget.newTarget(shCoefTx[0]));
-        shbaker.addColorTarget(FrameBufferTarget.newTarget(shCoefTx[1]));
+        FrameBuffer shbaker[] = {
+            new FrameBuffer(NUM_SH_COEFFICIENT, 1, 1),
+            new FrameBuffer(NUM_SH_COEFFICIENT, 1, 1)
+        };
+        shbaker[0].setSrgb(false);
+        shbaker[0].addColorTarget(FrameBufferTarget.newTarget(shCoefTx[0]));
+
+        shbaker[1].setSrgb(false);
+        shbaker[1].addColorTarget(FrameBufferTarget.newTarget(shCoefTx[1]));
+        
 
         int renderOnT = -1;
 
@@ -125,19 +131,17 @@ public class IBLGLEnvBakerLight extends IBLHybridEnvBakerLight {
 
             screen.updateLogicalState(0);
             screen.updateGeometricState();
-
-            shbaker.setTargetIndex(renderOnT);  
             
-            renderManager.setCamera(getCam(0, shbaker.getWidth(), shbaker.getHeight(), Vector3f.ZERO, 1, 1000), false);
-            renderManager.getRenderer().setFrameBuffer(shbaker);
+            renderManager.setCamera(getCam(0, shbaker[renderOnT].getWidth(), shbaker[renderOnT].getHeight(), Vector3f.ZERO, 1, 1000), false);
+            renderManager.getRenderer().setFrameBuffer(shbaker[renderOnT]);
             renderManager.renderGeometry(screen);
         }
 
             
         ByteBuffer shCoefRaw = BufferUtils.createByteBuffer(
-            NUM_SH_COEFFICIENT * 1 * ( shbaker.getColorTarget().getFormat().getBitsPerPixel() / 8)
+            NUM_SH_COEFFICIENT * 1 * ( shbaker[renderOnT].getColorTarget().getFormat().getBitsPerPixel() / 8)
         );
-        renderManager.getRenderer().readFrameBufferWithFormat(shbaker, shCoefRaw, shbaker.getColorTarget().getFormat());
+        renderManager.getRenderer().readFrameBufferWithFormat(shbaker[renderOnT], shCoefRaw, shbaker[renderOnT].getColorTarget().getFormat());
         shCoefRaw.rewind();
 
         Image img = new Image(format, NUM_SH_COEFFICIENT, 1, shCoefRaw, ColorSpace.Linear);

+ 18 - 8
jme3-core/src/main/java/com/jme3/environment/baker/IBLHybridEnvBakerLight.java

@@ -67,9 +67,10 @@ public class IBLHybridEnvBakerLight extends GenericEnvBaker implements IBLEnvBak
         super(rm, am, format, depthFormat, env_size);
 
         specular = new TextureCubeMap(specular_size, specular_size, format);
+        specular.setWrap(WrapMode.EdgeClamp);
         specular.setMagFilter(MagFilter.Bilinear);
         specular.setMinFilter(MinFilter.Trilinear);
-        specular.setWrap(WrapMode.EdgeClamp);
+
         specular.getImage().setColorSpace(ColorSpace.Linear);
         int nbMipMaps = (int) (Math.log(specular_size) / Math.log(2) + 1);
         if (nbMipMaps > 6) nbMipMaps = 6;
@@ -79,8 +80,10 @@ public class IBLHybridEnvBakerLight extends GenericEnvBaker implements IBLEnvBak
             sizes[i] = size * size * (specular.getImage().getFormat().getBitsPerPixel() / 8);
         }
         specular.getImage().setMipMapSizes(sizes);
-    }
+        specular.getImage().setMipmapsGenerated(true);
 
+    }
+    
     @Override
     public boolean isTexturePulling() { // always pull textures from gpu
         return true;
@@ -102,15 +105,20 @@ public class IBLHybridEnvBakerLight extends GenericEnvBaker implements IBLEnvBak
             int mipWidth = (int) (specular.getImage().getWidth() * FastMath.pow(0.5f, mip));
             int mipHeight = (int) (specular.getImage().getHeight() * FastMath.pow(0.5f, mip));
 
-            FrameBuffer specularbaker = new FrameBuffer(mipWidth, mipHeight, 1);
-            specularbaker.setSrgb(false);
-            for (int i = 0; i < 6; i++) specularbaker.addColorTarget(FrameBufferTarget.newTarget(specular).level(mip).face(i));
+            FrameBuffer specularbakers[] = new FrameBuffer[6];
+            for(int i=0;i<6;i++){
+                specularbakers[i]=new FrameBuffer(mipWidth,mipHeight,1);
+                specularbakers[i].setSrgb(false);
+                specularbakers[i].addColorTarget(FrameBufferTarget.newTarget(specular).level(mip).face(i));
+                specularbakers[i].setMipMapsGenerationHint(false);
+            }
+
 
             float roughness = (float) mip / (float) (specular.getImage().getMipMapSizes().length - 1);
             mat.setFloat("Roughness", roughness);
 
             for (int i = 0; i < 6; i++) {
-                specularbaker.setTargetIndex(i);
+                FrameBuffer specularbaker = specularbakers[i];
                 mat.setInt("FaceId", i);
 
                 screen.updateLogicalState(0);
@@ -123,12 +131,14 @@ public class IBLHybridEnvBakerLight extends GenericEnvBaker implements IBLEnvBak
                 if (isTexturePulling()) pull(specularbaker, specular, i);
 
             }
-            specularbaker.dispose();
+            for (int i = 0; i < 6; i++) {
+                specularbakers[i].dispose();
+            }
         }
         
         if (isTexturePulling()) endPulling(specular);
         specular.getImage().clearUpdateNeeded();
-
+ 
     }
 
     @Override