{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreib36epzd643vpyixvsqdrgvhpq75m3dvuvrzs5wdhgnum2okquztq",
    "uri": "at://did:plc:dxjzgxe7cvirxkwfjr2tjspt/app.bsky.feed.post/3mhfdrovtsmf2"
  },
  "path": "/t/march-2026-monthly-wip-screenshot-thread/49428#post_12",
  "publishedAt": "2026-03-18T12:44:17.000Z",
  "site": "https://hub.jmonkeyengine.org",
  "textContent": "As for textures, i am using bindless, so i have a large sampler2d array with fixed layout.\ntexture[ x ] is albedo\ntexture[ x+1 ] is normal\nand so on.\nWith bindless you can mix texture formats, and every shader in my game has access to the full palette of currently over 700 “materials”\n\nThe mesh is actually always the same in this demo, the base model from makehuman. nothing special about that.\n\nThe i create a large ssbo that holds the shader parameters. everything per instance data. morph targets/bone animations, textureId’s, worldMatrix, like anything that you would regularly pass as shader parameter.\n\nthe animation data is currently stored in a texture, so i do not have to pass the full skeleton for each model.\n\nthe mdi call is then basically a slightly better version of instancing, but with the option that it can be generated by a compute shader, and so i get fast culling. (not yet implemented) and that i can cache the parameter ssbo and mdi buffer for the next frame if nothing changes.\n\nthe only limitation is that each drawcall must run the same shader. no defines, no whatever. and that as you said, all meshes must be in a single vbo. if you want to render different meshes in one call.\n\nAnd the biggest drawback, you are leaving the safety-net of opengl and enter into lala land. basically free memory access, one wrong write outside of the buffer and it will crash your application/driver/system. unfortuantely nearly always the system, but its random",
  "title": "(March 2026) Monthly WIP Screenshot Thread"
}