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)
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)
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?
Not that simple 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.
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:
Not set the 0 length index buffer
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.