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?