WaterRenderPass in GameState causes NullPointerException

Hello

I am trying to add a water effect to my StandardGame. I have a GameState which handles the rendering of terrain, fog, sky, and water. The problem is that when I try and instantiate the WaterRenderPass I get a NullPointerException:


Exception in thread "main" java.lang.NullPointerException
   at com.jme.scene.state.lwjgl.LWJGLShaderObjectsState.isSupported(Unknown Source)
   at com.jme.scene.state.lwjgl.LWJGLShaderObjectsState.<init>(Unknown Source)
   at com.jme.renderer.lwjgl.LWJGLRenderer.createGLSLShaderObjectsState(Unknown Source)
   at com.jmex.effects.water.WaterRenderPass.initialize(Unknown Source)
   at com.jmex.effects.water.WaterRenderPass.<init>(Unknown Source)
   at com.eldertale.states.LoginSceneState.createWaterReflection(LoginSceneState.java:92)
   at com.eldertale.states.LoginSceneState.<init>(LoginSceneState.java:55)
   at com.eldertale.ElderTaleClient.<init>(ElderTaleClient.java:34)
   at com.eldertale.ElderTaleClient.main(ElderTaleClient.java:50)



I think, that is strange. I test it in the SimpleWaterTest in jmetest and it shows the water BUT I did notice it threw an error and caught it which looks like this:

Jun 9, 2008 8:38:27 PM com.jme.renderer.lwjgl.LWJGLTextureRenderer <init>
WARNING: FBO not supported.
Jun 9, 2008 8:38:27 PM com.jme.renderer.lwjgl.LWJGLPbufferTextureRenderer setMultipleTargets
INFO: Render to Texture Pbuffer supported!
Jun 9, 2008 8:38:27 PM class com.jme.renderer.lwjgl.LWJGLPbufferTextureRenderer initPbuffer()
SEVERE: Exception
org.lwjgl.LWJGLException: Could not find a valid pixel format
   at org.lwjgl.opengl.WindowsPbufferPeerInfo.nCreate(Native Method)
   at org.lwjgl.opengl.WindowsPbufferPeerInfo.<init>(WindowsPbufferPeerInfo.java:47)
   at org.lwjgl.opengl.WindowsDisplay.createPbuffer(WindowsDisplay.java:524)
   at org.lwjgl.opengl.Pbuffer.createPbuffer(Pbuffer.java:224)
   at org.lwjgl.opengl.Pbuffer.<init>(Pbuffer.java:204)
   at com.jme.renderer.lwjgl.LWJGLPbufferTextureRenderer.initPbuffer(LWJGLPbufferTextureRenderer.java:495)
   at com.jme.renderer.lwjgl.LWJGLPbufferTextureRenderer.<init>(LWJGLPbufferTextureRenderer.java:150)
   at com.jme.renderer.lwjgl.LWJGLPbufferTextureRenderer.<init>(LWJGLPbufferTextureRenderer.java:109)
   at com.jme.system.lwjgl.LWJGLDisplaySystem.createTextureRenderer(LWJGLDisplaySystem.java:344)
   at com.jmex.effects.water.WaterRenderPass.initialize(WaterRenderPass.java:201)
   at com.jmex.effects.water.WaterRenderPass.<init>(WaterRenderPass.java:175)
   at jmetest.effects.water.TestSimpleQuadWater.simpleInitGame(TestSimpleQuadWater.java:137)
   at com.jme.app.BaseSimpleGame.initGame(BaseSimpleGame.java:503)
   at com.jme.app.SimplePassGame.initGame(SimplePassGame.java:100)
   at com.jme.app.BaseGame.start(BaseGame.java:69)
   at jmetest.effects.water.TestSimpleQuadWater.main(TestSimpleQuadWater.java:80)
Jun 9, 2008 8:38:27 PM com.jme.renderer.lwjgl.LWJGLPbufferTextureRenderer initPbuffer
WARNING: LWJGL reports this card supports Render to Texture, but fails to enact it.  Please report this to the LWJGL team.
Jun 9, 2008 8:38:27 PM com.jme.renderer.lwjgl.LWJGLPbufferTextureRenderer initPbuffer
WARNING: Attempting to fall back to Copy Texture.
Jun 9, 2008 8:38:27 PM com.jme.renderer.AbstractCamera <init>
INFO: Camera created.
Jun 9, 2008 8:38:28 PM com.jme.renderer.lwjgl.LWJGLPbufferTextureRenderer setupTexture
INFO: setup tex8: 256,256
Jun 9, 2008 8:38:28 PM com.jme.renderer.lwjgl.LWJGLPbufferTextureRenderer setupTexture
INFO: setup tex9: 256,256
Jun 9, 2008 8:38:28 PM com.jme.renderer.lwjgl.LWJGLPbufferTextureRenderer setupTexture
INFO: setup tex10: 256,256
Jun 9, 2008 8:38:28 PM com.jmex.effects.water.WaterRenderPass reloadShader
INFO: Shader reloaded...



What could I do to make my GameState render water the same as TestSimpleQuadWater?

search the forum or wiki for GameTaskQueue / Nullposinterexception.

Some things need to be done in the OpenGL thread, or you will get nullpointer exceptions



http://www.jmonkeyengine.com/wiki/doku.php?id=simplegame_to_standardgame


GameTaskQueueManager.getManager().update(new Callable<Object>() {
    public Object call() throws Exception {
        stars.lockBounds();
        return null;
    }
}).get();

WARNING: LWJGL reports this card supports Render to Texture, but fails to enact it.  Please report this to the LWJGL team.

This seems like a pretty serious issue.. You might want to do what it says there.
Also downloading new drivers tends to fix those kinds of issues.

For the first question, you need to call the WaterRenderPass constructor inside the GL thread.