Aller au contenu principal

Session 35 — Fix ecran noir definitif : invalidateState() brise le pipeline JME

Cause racine identifiee par bisection

Appeler rm.getRenderer().invalidateState() dans AppState.render() brise
COMPLETEMENT le pipeline de rendu JME — meme le GuiNode ne s’affiche plus,
meme sans aucun menu. Le fond (background color du viewport) reste visible
mais AUCUNE geometrie ne se rend.

Ce bug est tres contre-intuitif car invalidateState() est documente comme
« force JME a re-uploader son etat GL », mais en pratique il corrompt quelque
chose dans le pipeline de rendu en JME 3.8.1.

Fix

// INTERDIT dans AppState.render() :
// rm.getRenderer().invalidateState();  // brise TOUT le rendu JME
// glUseProgram(0);                     // idem

@Override public void render(RenderManager rm) { /* ne rien faire ici */ }

Pour le passage menu -> jeu, on se contente dans cleanup() de :

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, w, h);
// C'est tout - JME gere le reste

Lecon apprise

Ne JAMAIS appeler rm.getRenderer().invalidateState() ni aucun appel GL
de type « reset complet » dans AppState.render(). JME gere son propre etat
GL interne et appeler invalidateState() le perturbe irreversiblement.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *