Komischer Bug beim .obj-Laden

Ja, das könnte sein, bzw. habe ich kurz zuvor ein Windows Update gemacht.
Leider zeigt er an, dass es seit 120 deprecated ist und wenn ich zu dieser Version runtergehe, funktionieren andere Vordefinierte Methoden nicht. Und das komische ist, meine 3D-Objekte funktionieren ohne gl_FragColor.

Aber die 2D Objekte nicht. Ich habe auch das von der Webseite mit dem layout(location=irgendwas) probiert, das hat aber nichts geändert.

Bei nur einer als out deklarierten Variable im Fragment Shader sollte das eigentlich gehen. Wird beim Erzeugen des OpenGL Kontextes explizit eine bestimmte OpenGL Version angefordert? Wird das nicht gemacht, ist es reiner Zufall ob das OpenGL Programm das gewünschte Verhalten aufweist.

Zu GLSL 1.50 gehört OpenGL 3.2.

Gibt glGetError etwas anderes als 0 aus?

Gruß
Fancy

glGetError gibt 0. Eine bestimmte Version habe ich nirgends irgendwie eingebaut, aber GL_VERSION gibt 7938 zurück, ich weiß nicht, ob das was nützt. Und wie gesagt, in meinem Shader für 3D Objekte geht’s auch.

7938 ist lediglich die dezimale Darstellung der Konstante GL_VERSION. Du musst den zugehörigen String über

System.out.println(version);```

abfragen. Du hast bisher mit dem experimentiert was deine Grafikkarte mit dem Treiber der auf deinem Rechner installiert war zur Verfügung stellte. Das heißt aber nicht das Dein Programm auf einem anderen Rechner, einer anderen Grafikkarte oder mit einem anderen Treiber noch funktioniert. Ganz speziell nicht, wenn Du dem Treiber nicht explizit sagst welche OpenGL Version Du nutzen möchtest.

Auch das ein anderer Teil deines Programms noch geht, besagt nichts. Lediglich das in dem Teil der nun nicht mehr geht, irgendetwas nicht mit der neueren OpenGL Version funktioniert. Das muss nicht am Fragment Shader liegen, das kann überall sein.

Mit dem alten LWJGL kannst Du die OpenGL Version explizit anfordern mit:

```    public static final int GL_MAJOR_VERSION = 3;
    public static final int GL_MINOR_VERSION = 2;

        final DisplayMode displayMode = new DisplayMode(WIDTH, HEIGHT);
        final PixelFormat pixelFormat = new PixelFormat();
        final ContextAttribs contextAttribs = new ContextAttribs(GL_MAJOR_VERSION, GL_MINOR_VERSION);

        Display.setDisplayMode(displayMode);
        Display.create(pixelFormat, contextAttribs);```

Ob und wie das mit dem Canvas geht kann ich nicht sagen, und da das schon doppelt deprecated ist, finde ich das auch nicht spannend genug es selbst herausfinden zu wollen.

Schlimmstenfalls hast Du vorher etwas genutzt das nun zwischen zwei Versionen liegt, dann den Fehler zu finden kann unschön werden.

Bei OpenGL reicht "läuft" eben nicht, man muss sich genau an die Spezifikation halten und zu der gehört auch die Version.

Gruß
Fancy

Ich weiß ja nicht, aber bei

        final ContextAttribs contextAttribs = new ContextAttribs(GL_MAJOR_VERSION, GL_MINOR_VERSION);

gibts einen Fehler, dass man im Konstruktor nur eine Int übergeben kann.

Die zugehörige JavaDoc sagt 2: ContextAttribs (LWJGL API)

Gruß
Fancy

Ok, ich hab’s hingekriegt, ich hatte das falsche davon importiert. Aber jetzt wird nur noch die Hälfte aller Objekte beleuchtet und die 2D-Objekte sind immer noch nicht da.

Es muss doch möglich sein, den Ausgangszustand mithilfe dieser Versionseinstellungen wiederherzustellen, denn es hat ja schon mal funktioniert.
Info: Ich ändere auch gerne die Shader Version. 150 ist rein zufällig gewählt.

Auch wenn das aufgrund der stürmischen Antworten hier schon klar sein sollte: Es ist sehr, sehr schwer (d.h: unmöglich) per Ferndiagnose und auf Basis von zusammenhangslosen (und mit Verlaub, meistens gräßlichsten) Codeschnipseln zu sagen, wo das Problem liegt. Von “Ausgeschalteter Monitor” bis “Tippfehler im Shader” kann das jede mögliche Ursache haben. Vielleicht würde es sich jemand ansehen, wenn es als ZIP irgendwo liegen würde, aber wie viel Zeit man dann in Fehlersuche investiert, ist nochmal eine andere Frage.

Ich poste mal, wie das Zeichnen der 2D Objekte aussieht, vielleicht hilft das weiter:

        GL20.glUniform1i(activity.textureLocation, 0);
	glActiveTexture(GL_TEXTURE0); 
    	glBindTexture(GL_TEXTURE_2D, textur.id);
    	glBindVertexArray(vaoID);
        glEnableVertexAttribArray(0);
        glEnableVertexAttribArray(1);
        glEnableVertexAttribArray(2);
        
        glDrawElements(mode, indexBuffer);

        glDisableVertexAttribArray(0);
        glDisableVertexAttribArray(1);
        glDisableVertexAttribArray(2);
        glBindVertexArray(0);

Tippfehler im Shader kanns ja nicht sein, denn er spuckt keine Fehlermeldung aus, und ihr kennt den Code ja schon.
Wenn der Monitor ausgeschaltet wäre, dann würde ich nichts erkennen, das würde selbst ich bemerken, denke ich. :wink:

Due weißt dass das nur ein Beispiel sein sollte, aber ob ich jetzt plaktativ-gestelzte Fragen stellen sollte wie “Stimmt die textur.id?” und “Stimmt die vaoID?” weiß ich nicht…

Außer im Shader habe ich nichts geändert und deswegen sollten die IDs alle stimmen. Oder ändern sich durch die Version auch die IDs?

Wie meinst du das? “Oder ändern sich durch die Version auch die IDs?”
Natürlich ändern sich die IDs wenn du ihnen selber keinen festen Wert zuweist dann bekommst du einen zufälligen zurück.

Häufig beginnt er bei 0 und steigert sich immer um eins, es sei denn ein Bild wird entfernt dann bekommst du gerne auch wieder die freie ID zurück. Das ist aber nicht überall gegeben. Auf meinem derzeitigen Rechner lautet die ID zuweisung seitens OGL die ich im Log ausgebe für Texturen (auch für Programs und für die Shadervariablen (verwende nicht das “location” attribut im shader)):

0
1
2
5
4
3
6
8
9
7
...

Welcher Logik das folgt… also sofern du OpenGL nicht sagst welche ID deine textur bekommen soll muss dein Program sich die zugewiesene ID selber merken.

(Der Hinweis mit den IDs war AUCH wieder nur eine subtile Andeutung der Tatsache, dass das Symptom “OpenGL zeichnet nix” SO viele Ursachen haben kann, dass man ohne genaue Analyse des Codes meistens nichts dazu sagen kann. Nur ein Beispiel: Ich hatte mal ein OpenGL-Programm. Mit VBOs und Shadern und so. Und das lief auch ganz toll. Dann habe ich ein Grafikkartenupdate gemacht, und dann blieb das Fenster schwarz. Mit einer Mischung aus “Glück beim Googlen” und … ja, eigentlich NUR “Glück beim Googlen” habe ich dann herausgefunden, dass man, wenn man einen VBO zu rendern verwenden will, IMMER ein VAO verwenden muss. Die alte Grafikkartentreiberversion hat das nicht erzwungen, und das VBO auch ohne VAO gerendert. Wie gesagt, nur ein Beispiel…)

Ja, das mit den IDs war im Nachhinein betrachtet keine so kluge Frage, mein Programm merkt sich diese IDs selbst. Ich werds auch mal mit Googlen versuchen. Vielleicht habe ich auch Glück.

Ok, ich habs jetzt gelöst. Statt für den Vertexshader des 2D Shaders auch den Vertex des 3D Shaders zu nehmen(nur mit entsprechenden Matrizen), habe ich einen Vertexshader fürs 2d gemacht. Das ist ein bisschen komisch, denn eigentlich steht in beiden ungefähr dasselbe drin, aber Hauptsache es funktioniert. Jetzt kann ich mich wieder dem eigentlichen Problem widmen.

Nach langem hin und her muss ich zugeben, ich kriegs einfach nicht raus!
Alle Punkte an der selben Stelle sollen gelöscht werden, wenn einer geklickt wird.
getGleichePunkte gibt die Indexe eben dieser positionsgleichen Punkte zurück. Ich habe es fürs erste nur mit dem Koordinatenlöschen und nicht mit dem Indexlöschen gemacht. Also: Punkt Nummer 15 wird geklickt er kommt 3 Mal vor. Wenn man nun hier:


-0.311052 0.21791 0.798047
-0.456289 -0.014817 0.925725
-0.456289 -0.014817 -0.925042
-0.311052 0.21791 0.798047
0.312115 0.21791 0.798047
0.456697 -0.014817 0.925725
0.312115 0.21791 0.798047
0.313673 0.218541 -0.798578
0.456697 -0.014817 -0.925042
-0.311052 0.21791 -0.797382
-0.456289 -0.014817 -0.925042
0.456697 -0.014817 -0.925042
-0.456289 -0.014817 0.925725
0.456697 -0.014817 0.925725
0.456697 -0.014817 -0.925042
0.312115 0.21791 0.798047
-0.311052 0.21791 0.798047
-0.311052 0.21791 -0.797382
-0.311052 0.21791 -0.797382
-0.456289 -0.014817 0.925725
0.456697 -0.014817 0.925725
0.312115 0.21791 0.798047
0.456697 -0.014817 -0.925042
0.313673 0.218541 -0.798578
-0.311052 0.21791 -0.797382
0.456697 -0.014817 -0.925042
-0.456289 -0.014817 -0.925042
0.313673 0.218541 -0.798578

Punkt Nummer 15 nachschlägt, bekommt man “0.456697 -0.014817 -0.925042”
Also müsste danach alles mit diesen Koordinaten weg sein.
Sehen wir doch mal Nach:


-0.311052 0.21791 0.798047
-0.456289 -0.014817 0.925725
-0.456289 -0.014817 -0.925042
-0.311052 0.21791 0.798047
0.312115 0.21791 0.798047
0.456697 -0.014817 0.925725
0.312115 0.21791 0.798047
0.313673 0.218541 -0.798578
0.456697 -0.014817 -0.925042

Und da sehen wir:
Ziemlich viel ist weg, aber “0.456697 -0.014817 -0.925042” bleibt, zumindest einmal.
Ich weiß nicht weiter. Hier der Code, ihr könnt ihn ja mal mit verschiedenen Koordinaten durchspielen:

public void punktLöschen(int punktIndex) {
			int[] inds = getGleichePunkte(punktIndex);
			System.out.println(punktIndex);
			System.out.println(inds.length);
			System.out.println("Vorher:");
			ArrayList<Float[]> coords = new ArrayList<Float[]>();
			for(int i = 0; i < anzeige.coords.length; i+=3){
				coords.add(new Float[]{anzeige.coords**, anzeige.coords[i+1], anzeige.coords[i+2]});
				System.out.println(anzeige.coords**+" "+anzeige.coords[i+1]+" "+anzeige.coords[i+2]);
			}
			for(int z = 0; z < inds.length; z++){
				int gelöschterPunkt = inds[z];
				for(int i = 0; i < coords.size(); i++){
					if(i==gelöschterPunkt){
						coords.remove(i);
					}
				}
			}
			int a = 0;
			System.out.println("Nachher:");
			anzeige.coords = new float[coords.size()*3];
			for(int i = 0; i < coords.size(); i+=3){
				anzeige.coords** = coords.get(a)[0];
				anzeige.coords[i+1] = coords.get(a)[1];
				anzeige.coords[i+2] = coords.get(a)[2];
				System.out.println(anzeige.coords**+" "+anzeige.coords[i+1]+" "+anzeige.coords[i+2]);
				a++;
			}
		}

Hallo, weiß wer was dazu?

oh, das sieht ja mal nicht nach obj-Bobbel-Quatsch aus sondern nach einem Java-Problem,
evtl. immer in eigenen Threads sinnvoll benannt prominenter darstellen,

komplettes Testprogramm inklusive Eingabedaten wäre auch nicht schlecht,

soweit grob ein Hinweis zur Thematik:
wenn man Elemente aus einer Liste löscht, verschieben sich die Indexe

hat man etwa eine Liste mit 4 Strings A, B, C, D und gefallen einem B und C nicht,
darf man nicht einfach Indexe 1 und 2 nacheinander löschen, denn:

        l.add("A");
        l.add("B");
        l.add("C");
        l.add("D");

        l.remove(1);
        l.remove(2);

        System.out.println(l); // [A, C]

mal abgesehen davon, dass

                for(int i = 0; i < coords.size(); i++){
                    if(i==gelöschterPunkt){
                        coords.remove(i);
                    }
                }

und

                        coords.remove(i);

weitgehend äquivalenter Code ist, außer der Punkt liegt außerhalb des (verbleibenden) Index-Bereiches, wozu es bei sowas durchaus auch als Problem kommen kann


zur Lösung könnte man nun während des Löschens mitzählen und umrechnen
oder anderes komplizierteres

in Reihenfolge rückwärts löschen geht auch noch recht gut, erst Index 2, dann 1, -> A + D erfolgreich