BloomRenderPass in game state

Hello



i have been trying to make my game more artistic looking by adding a bloom effect. however i am using GameStates and do not want to use the SimplePassGame. i did the most logical thing i could think of and made a PassState. so that all the RenderPass effects would be handled by the Pass GameState. however when i did this, it resulted in the screen flickering, and i got an error message.



my gamestate was this:

package base.gameStates;

import base.MainStateManeger;

import com.jme.math.Vector3f;
import com.jme.renderer.Camera;
import com.jme.renderer.Renderer;
import com.jme.renderer.pass.BasicPassManager;
import com.jme.renderer.pass.RenderPass;
import com.jme.scene.Node;
import com.jme.scene.Text;
import com.jme.scene.Spatial.LightCombineMode;
import com.jme.system.DisplaySystem;
import com.jmex.effects.glsl.BloomRenderPass;
import com.jmex.game.state.GameState;

public class PassState extends GameState {
   
   public BasicPassManager pManager = new BasicPassManager();
   public BloomRenderPass bloomRenderPass;
   private Node scene = MainStateManeger.getInstance().levels.scene;
   public PassState(Camera cam, Node consoleNode)
   {
      RenderPass scenePass = new RenderPass();
      scenePass.add(scene);
      pManager.add(scenePass);
      
      RenderPass statPass = new RenderPass();
      statPass.add(consoleNode);
      pManager.add(statPass);
      
      
      bloomRenderPass = new BloomRenderPass(cam, 4);
      if(!bloomRenderPass.isSupported()) {
              Text t = Text.createDefaultTextLabel("Text", "GLSL Not supported on this computer.");
              t.setRenderQueueMode(Renderer.QUEUE_ORTHO);
              t.setLightCombineMode(LightCombineMode.Off);
              t.setLocalTranslation(new Vector3f(0,20,0));
              scene.attachChild(t);
          } else {
              bloomRenderPass.add(scene);
              bloomRenderPass.setEnabled(true);
              bloomRenderPass.setUseCurrentScene(true);
              pManager.add(bloomRenderPass);
             
          }
   }

   @Override
   public void cleanup() {
      // TODO Auto-generated method stub
      pManager.cleanUp();
   }

   @Override
   public void render(float tpf) {
      // TODO Auto-generated method stub
      pManager.renderPasses(DisplaySystem.getDisplaySystem().getRenderer());
   }

   @Override
   public void update(float tpf) {
      // TODO Auto-generated method stub
      
      pManager.updatePasses(tpf);
      
   }

}



and the result was this:

Nov 12, 2009 11:53:20 AM com.jme.renderer.lwjgl.LWJGLTextureRenderer <init>
INFO: FBO support detected.
Nov 12, 2009 11:53:20 AM com.jme.renderer.lwjgl.LWJGLTextureRenderer initCamera
INFO: Init RTT camera
Nov 12, 2009 11:53:20 AM com.jme.renderer.AbstractCamera <init>
INFO: Camera created.
Nov 12, 2009 11:53:20 AM com.jme.renderer.lwjgl.LWJGLTextureRenderer setupTexture
INFO: setup fbo tex with id 8: 160,120
Nov 12, 2009 11:53:20 AM com.jme.renderer.lwjgl.LWJGLTextureRenderer setupTexture
INFO: setup fbo tex with id 9: 160,120
Nov 12, 2009 11:53:20 AM com.jme.renderer.lwjgl.LWJGLTextureRenderer setupTexture
INFO: setup fbo tex with id 10: 160,120
Nov 12, 2009 11:53:21 AM class com.jme.renderer.lwjgl.LWJGLTextureRenderer render(Spatial, Texture, boolean)
SEVERE: Exception
java.lang.NullPointerException
   at com.jme.renderer.lwjgl.LWJGLTextureRenderer.deactivate(LWJGLTextureRenderer.java:994)
   at com.jme.renderer.lwjgl.LWJGLTextureRenderer.render(LWJGLTextureRenderer.java:536)
   at com.jme.renderer.lwjgl.LWJGLTextureRenderer.render(LWJGLTextureRenderer.java:506)
   at com.jmex.effects.glsl.BloomRenderPass.doRender(BloomRenderPass.java:279)
   at com.jme.renderer.pass.Pass.renderPass(Pass.java:92)
   at com.jme.renderer.pass.BasicPassManager.renderPasses(BasicPassManager.java:90)
   at base.gameStates.PassState.render(PassState.java:58)
   at com.jmex.game.state.GameStateNode.render(GameStateNode.java:83)
   at base.MainStateManeger.render(MainStateManeger.java:199)
   at com.jme.app.BaseGame.start(BaseGame.java:87)
   at base.MainStateManeger.main(MainStateManeger.java:55)
Nov 12, 2009 11:53:30 AM com.jme.app.BaseGame start
INFO: Application ending.



some of the code on the game state is very specific to the game i am creating.

has anyone tried my approach before though? is there a simple solution?

… Wait did I understad right, that you used several RenderPasses in on GameState?

You used several Renderpases in one GameState=

clwillingham said:

RenderPass scenePass = new RenderPass();
      scenePass.add(scene);
      pManager.add(scenePass);
      
      RenderPass statPass = new RenderPass();
      statPass.add(consoleNode);
      pManager.add(statPass);




Empire Phoenix said:

.. Wait did I understad right, that you used several RenderPasses in on GameState?


It would certainly seem that way
sbook said:

clwillingham said:

RenderPass scenePass = new RenderPass();
      scenePass.add(scene);
      pManager.add(scenePass);
      
      RenderPass statPass = new RenderPass();
      statPass.add(consoleNode);
      pManager.add(statPass);




Empire Phoenix said:

.. Wait did I understad right, that you used several RenderPasses in on GameState?


It would certainly seem that way


Indeed !
you can't have more than one RenderPass most likely =]

It looks like something is wrong with the depth buffering… I would start with this error:

at com.jme.renderer.pass.Pass.renderPass(Pass.java:92)

whats wrong with using several render passes? its used in the bloom example that comes with JME. how should you really do it?