LWJGL/OpenGL rendert manche Objekte nicht

babuschka

Top Contributor
Hallo,

ich programmiere derzeit mein erstes 3D-Spiel und nutze dabei LWJGL 2.8.3. Allerdings werden seit kurzer Zeit manche Objekte nicht mehr gerendert 🙁. Ich bin mir zu 99,9% sicher, dass die Methode zum rendern des Objekts ausgeführt wird (Bei jedem Frame neu). Sie sieht beispielsweise so aus:

Java:
        GL11.glTranslatef(position.getX(),position.getY(),position.getZ());
        GL11.glColor3f(1.0f,0.0f,0.0f);    
        Sphere s = new Sphere();
        s.draw(0.5f, 20, 16);
        GL11.glTranslatef(-position.getX(),-position.getY(),-position.getZ());

Das merkwürdige ist, dass beim Start des Spiels alle Objekte korrekt gerendert werden, nach einiger Zeit aber verschwinden manche oder alle Objekte und kommen später wieder, sie werden aber auf jeden Fall beim rendern an OpenGL übergeben.

Hier noch der Code der beim Start des Spiels ausgeführt wird:
Java:
        GL11.glClearColor(0.0f,0.0f,0.0f,0.0f);

        GL11.glClearDepth(1.0f);
        GL11.glEnable(GL11.GL_DEPTH_TEST);
        
        GL11.glEnable(GL11.GL_COLOR_MATERIAL);
          
        GL11.glShadeModel(GL11.GL_SMOOTH);
        
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

        GL11.glViewport(0,0,(int)DISPLAY_WIDTH,(int)DISPLAY_HEIGHT);

Und der Code, der bei jedem Frame ausgeführt wird:
Java:
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
      GL11.glLoadIdentity(); 

      GL11.glDisable(GL11.GL_BLEND);
      GL11.glEnable(GL11.GL_LIGHTING);
      GL11.glDisable(GL11.GL_TEXTURE_2D);   
       
      GL11.glMatrixMode(GL11.GL_PROJECTION);
      GL11.glLoadIdentity();
      GLU.gluPerspective(45.0f, (float) DISPLAY_WIDTH / (float) DISPLAY_HEIGHT, 0.1f, 100.0f);
      GL11.glPushMatrix();
    
      GL11.glMatrixMode(GL11.GL_MODELVIEW);
      GL11.glLoadIdentity();
      GL11.glPushMatrix();

// 3D-Objekte werden hier gerendert

        GL11.glEnable(GL11.GL_BLEND);
        GL11.glDisable(GL11.GL_LIGHTING);
        GL11.glEnable(GL11.GL_TEXTURE_2D);   
       
        GL11.glMatrixMode(GL11.GL_PROJECTION);
	GL11.glPopMatrix();
        
	GL11.glLoadIdentity();
	GL11.glOrtho(0, DISPLAY_WIDTH, DISPLAY_HEIGHT, 0, -1, 1);

	GL11.glMatrixMode(GL11.GL_MODELVIEW);
	GL11.glPopMatrix();
	GL11.glLoadIdentity();

// 2D-GUI wird hier gerendert

Gibt es irgendein Limit an Quads? Habe ich OpenGL falsch eingerichtet?
Da ich nicht viel Ahnung von OpenGL habe und diesen Code mehr oder weniger durch probieren herausgefunden habe, ist letzteres sehr wahrscheinlich.
Auch glGetError() gibt mir keinen Fehler aus. Das Problem habe ich an mehreren PCs (bei mir und in der Schule).


Über eine Antwort würde ich mich sehr freuen, ich verzweifle schon seit einer Woche an dem Problem, und bei Google finde ich auch nichts passendes.

Jasper
 
Zuletzt bearbeitet von einem Moderator:
Schwer zu sagen, bisher. Was ist denn Spehere und was macht "draw"? Gibt es irgendwelche Veränderungen (Renderfehler oder so) oder ist sie wirklich von jetzt auch gleich WEG?
 
Sphere ist von GLU, enthalten in LWJGL. Und ja, die Objekte verschwinden von jetzt auf gleich, als würden sie nicht an OpenGL nicht mehr übergeben werden. Sie werden aber definitiv übergeben, habe ich alles getestet.
 
Dann wird's wirklich schwierig. Den "üblichen Verdächtigen" erwähne ich nur mal kurz: Grafiktreiber auf dem neuesten Stand?
Ansonsten würde ein KSKB vielleicht helfen...
 
Moin,

interessant wäre vielleicht auch was für Werte in [c]position[/c] stehen. So wie die near- und far- plane oben gesetzt wird, wird alles, was näher als 0.1 oder weiter als 100.0 Einheiten entfernt ist, nicht mehr gezeichnet.

Viele Größe,
Fancy
 
Wage Vermutung... GLU!
Ich hatte damit kürzlich auch Probleme und zwar mit MipMaps. Sobald ich dort für den Puffertyp andere Werte als "GL_UNSIGNED_BYTE" übergab, blieben die Objekte weiss. Es wurde alles korrekt über geben und es gab auch keine Fehler. Mein Graka-Treiber wird von NVidia immer automatisch aktualisiert, der kann es also nicht sein. Obwohl... vllt. hat sich in OpenGL ja etwas geringfügig verändert und LWJGL ist da noch nicht nachgekommen. Jedenfalls sind mir bei den Puffertypen aus GL inzwischen die korrespondierenden GLU-Konstanten (z.B. GLU_UNSIGNED_BYTE) aufgefallen, die es in LWJGL aber meines Wissens noch gar nicht gibt.Immerhin könnten deren Wertigkeiten ja unterschiedlich sein.
 
Danke für eure Antworten!

Meine Grafikkartentreiber sind aktuell, mit KSKB wirds schwierig, da das Spiel schon relativ umfangreich ist.
Auch, dass die Positionen nicht stimmen, kann nicht sein. Zum einen sind die Objekte in der richtigen Entfernung, und meine Kollisionen werden nach den gleichen Werten berechnet, und die funktionieren.
Es könnte vllt wirklich an GLU liegen, da die Fehler mit erst dann auffielen, als ich die Spheres von GLU verwendet habe. Zudem ist GLU in LWJGL nur zu Testzwecken enthalten, kann gut sein, dass da ein paar Fehler drin sind. Ich werde heute Nachmittag mal ausprobieren, ob es ohne GLU funktioniert.
 

Zurück
Oben