Migrating from JME 3.0 -> 3.1 alpha 2, problem with material Alpha (edit: empty index buffers)

Hi,

I’m migrating from JME 3.0 → 3.1 alpha 2 and somehow materials with alpha don’t work. After removing the UseAlpha parameter (as it was removed from the standard Common/MatDefs/Light/Lighting.j3md definition I’m using). When trying to load them, I get:

SEVERE: Uncaught exception thrown in Thread[jME3 Main,5,main]
com.jme3.renderer.RendererException: Attempting to upload empty buffer (limit = 0), that’s an error
at com.jme3.renderer.lwjgl.LwjglGLExt.checkLimit(LwjglGLExt.java:23)
at com.jme3.renderer.lwjgl.LwjglGLExt.glBufferData(LwjglGLExt.java:32)
at com.jme3.renderer.opengl.GLRenderer.updateBufferData(GLRenderer.java:2288)
at com.jme3.renderer.opengl.GLRenderer.drawTriangleList(GLRenderer.java:2466)
at com.jme3.renderer.opengl.GLRenderer.renderMeshDefault(GLRenderer.java:2673)
at com.jme3.renderer.opengl.GLRenderer.renderMesh(GLRenderer.java:2697)
at com.jme3.material.Material.renderMeshFromGeometry(Material.java:728)
at com.jme3.material.Material.render(Material.java:1217)
at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:548)
at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:266)
at com.jme3.renderer.queue.RenderQueue.renderQueue(RenderQueue.java:305)
at com.jme3.renderer.RenderManager.renderViewPortQueues(RenderManager.java:814)
at com.jme3.post.ssao.SSAOFilter.postQueue(SSAOFilter.java:115)
at com.jme3.post.FilterPostProcessor.postQueue(FilterPostProcessor.java:230)
at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:1035)
at com.jme3.renderer.RenderManager.render(RenderManager.java:1088)
at com.jme3.app.SimpleApplication.update(SimpleApplication.java:260)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:151)
at com.jme3.system.lwjgl.LwjglDisplay.runLoop(LwjglDisplay.java:192)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:232)
at java.lang.Thread.run(Thread.java:745)

Also without the SSAO I get this problem.

Mar 01, 2016 3:36:02 PM com.jme3.app.Application handleError
SEVERE: Uncaught exception thrown in Thread[jME3 Main,5,main]
com.jme3.renderer.RendererException: Attempting to upload empty buffer (limit = 0), that’s an error
at com.jme3.renderer.lwjgl.LwjglGLExt.checkLimit(LwjglGLExt.java:23)
at com.jme3.renderer.lwjgl.LwjglGLExt.glBufferData(LwjglGLExt.java:32)
at com.jme3.renderer.opengl.GLRenderer.updateBufferData(GLRenderer.java:2288)
at com.jme3.renderer.opengl.GLRenderer.drawTriangleList(GLRenderer.java:2466)
at com.jme3.renderer.opengl.GLRenderer.renderMeshDefault(GLRenderer.java:2673)
at com.jme3.renderer.opengl.GLRenderer.renderMesh(GLRenderer.java:2697)
at com.jme3.material.Material.renderMeshFromGeometry(Material.java:728)
at com.jme3.material.Material.renderMultipassLighting(Material.java:945)
at com.jme3.material.Material.render(Material.java:1207)
at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:564)
at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:266)
at com.jme3.renderer.queue.RenderQueue.renderQueue(RenderQueue.java:305)
at com.jme3.renderer.RenderManager.renderViewPortQueues(RenderManager.java:814)
at com.jme3.renderer.RenderManager.flushQueue(RenderManager.java:725)
at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:1040)
at com.jme3.renderer.RenderManager.render(RenderManager.java:1088)
at com.jme3.app.SimpleApplication.update(SimpleApplication.java:260)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:151)
at com.jme3.system.lwjgl.LwjglDisplay.runLoop(LwjglDisplay.java:192)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:232)
at java.lang.Thread.run(Thread.java:745)

It never did anything so it was removed. This is not your issue… just coincidence.

Sounds like one of your meshes has an empty buffer.

1 Like

You are right. Sometimes my index buffer is empty. JME 3.0 just took it like a champ. So in which order I should construct one when it is “default”? By “default” I mean, I guess there is some natural ordering assumed by OpenGL when the buffer is empty?

Hmm, yeah, I can just not put it if it is empty…

^^

Not that simple :frowning: I don’t know why, but I can’t reproduce the model. The indices (index buffer) are quite weird, but indeed works with JME 3.0 nicely. If I left those out since they don’t work anymore in JME 3.1, the triangles are quite off.

Maybe it had buffers but the limits were set wrong? If leaving the empty buffers out changes the way the model works then they weren’t really empty.

Something is wrong with your model and JME was more lenient with it before.

They were really empty on this particular model. I’m reading these Dungeon Keeper II models. They usually have 16 versions of indices (LOD levels). But with this one they are not in order (I assume that higher the count, higher the detail) and some are empty. So somehow JME filtered and probably even ordered this data for me.

Fortunately this is a problem only on some models. Systematic still.

I get the same effect in JME 3.0 if I don’t put in the 0 length index buffer. So OpenGL ordering is not right. The 0 length buffer does something magical…

Ok, I think I got it! If indices are empty, I should do in JME 3.1:

  1. Not set the 0 length index buffer
  2. Set the mesh to mesh.setMode(Mesh.Mode.Points); ← maybe this one was somehow automatic before

I think that is it. Still a bit puzzled what to do with the LOD levels. Maybe just leave them not set for models like this. As said, from 16 LOD levels this guy had 5 & 6 set, others were empty, doesn’t make sense to me. But that is not JME’s problem most likely.

Well, actually the ultimate correct answer was to do business as usual. Only with one exception, instead of empty index buffer, I wrote [0] (length == 1) in that case. Works with both, 3.0 & 3.1. Point mesh broke batching & whatnot.

Here, a little bit off topic but we got a major speed boost from JME 3.1. So thanks. The FPS is not limited. The reason I believe is in our scene graph, it became quite complex (lot of branches) and JME 3.0 traverses it unneeded.

Sweet melody to our ears :wink: thanks

No, thank YOU! :slight_smile:

Yay… glad to know that speed bump works for you. I had to stand on my head to figure out how to make that work with minimal invasiveness. :slight_smile:

1 Like