jme-Vulkan
jMonkeyEngine Hub
May 23, 2026
Thanks for your reply!
Unlike OpenGL, Vulkan requires you to define exactly what types are bound to specific pipeline slots on the backend. While OpenGL abstracts this away, this explicitness is necessary in Vulkan.
Looking at other engines, the approaches vary widely due to compatibility concerns:
Unity & UE use custom shader languages. They have their own mechanisms to map shader variables to pipeline slots (Unity relies on name matching via Shader Reflection, while UE uses static struct mapping with RDG and macros).
Godot offers an interesting hybrid. It has RDShader(similar to Unity’s automation), but its RenderingDeviceAPI forces explicit binding layouts when using raw GLSL.
Godot’s approach feels like a good fit for JME, though it would need some adaptation. Currently, jme3-coreallows us to choose between OpenGL and Vulkan at the frontend, but the underlying differences remain significant. My goal is to bridge these gaps so we don’t have to abandon OpenGL while still being able to leverage Vulkan (though that might be easier said than done, haha).
My current plan is to provide default pipelines for the standard JME materials (like VKUnshaded.j3mdand VKLighting.j3md). If users want to write custom shaders, they would need to define custom pipelines as well.
Of course, I’m still learning, and I’m open to changing my mind if I find a better solution down the road!
"Vulkan requires all resource binding layouts (Pipeline Layout / Descriptor Set Layout) to be defined upfront when creating the Pipeline, whereas OpenGL allows you to call glBindTextureor glUniformat any point before drawing."
Discussion in the ATmosphere