Problem bei Library Debugging


#1

Hey Leute. Das ist ein “Cross Post”, da ich die gleiche Frage bereits bei Stackoverflow gepostet habe. Normalerweise mach ich das nicht, aber da hat wohl keiner Lust sich die Frage durchzulesen, bzw
keiner nen Plan… jedenfalls ich hoffe ihr verzeiht mir, und hier der link, (http://stackoverflow.com/questions/23975232/trouble-debugging-my-opengl-library) und ich sag auch sofort bescheid wenn sich da doch einer meldet!
Nun zum Problem…

Ich schreib ja gerade meine kleine Mini-Lwjgl-Library. Nun hab ich ein Problem dabei, wenn ich mehr als eine Sache in einer View zeichnen lassen will. Ich versteh nur nicht warum.
In einem Kskb, das ich langsam versucht hab in die lib einzubauen, sieht das ganze so aus:

firstTexture.bind();
new Matrix4f().translate(...).store(buffer);
buffer.flip();
GL20.glUniformMatrix4(id, false, buffer);
GL11.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, 4);

secondTexture.bind();
new Matrix4f().translate(...).store(buffer);
buffer.flip();
GL20.glUniformMatrix4(id, false, buffer);
GL11.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, 4);

Das ganze funktioniert auch wie es soll. Nur in meiner Library nicht. Das Ergebniss, wenn ich versuche das ganze mit der Lib umzusetzen, könnt ihr euch hier anschauen: [http://tinypic.com/player.php?v=2ntfuys>&s=8#.U4pe8XJ_uRM] (Qualität unten wegen der Größe, aber es geht um das flackern der Objekte, die ich mit der Maus bewege).

Ich versuch mal zu erklären warum ich nichts verstehe, bzw nicht weiß wo ich den Fehler suchen sollte:

Der wichtigste Teil, quasi der Global Rendering Code im AGLRenderController sieht so aus:

for(AGLView view : activeViews){
    view.render(activeTexture);
}

Der Controller geht durch alle views (~scenes) und ruft deren render code auf. Ich hab nur eine Szene, also weiter:
(Ich habe übrigens herausgefunden, das das ganze funktioniert wenn ich 2 Shader Programme benutze. (für jedes Objekt eins), das heißt
wohl der Fehler liegt irgendwo bei der Uniform…??)

Jedenfalls, Der wichtigste Teil von dem View render code:

for(AGLRenderable r : renderObjects){
    r.beforeRenderUpdate();
    r.render(r.getDrawMode());
}

Die Render objekte werden durchlaufen, dann beforeRenderUpdate und render aufgerufen. Nun beginnt der spannende Teil.

beforeRenderUpdate():

updateUniform();

Da ist noch ein bisschen mehr, aber das ist an dieser Stelle nicht wichtig. updateUniform sieht so aus: (wieder nur das wichtigste)

modelUniform.putData(getModel());
modelUniform.updateData();

Wenn man das ausschreibt sieht es so aus:

protected void putData(Matrix4f matrix){
    matrix.store(super.data);
    super.data.flip();
}
protected void updateData(){
    GL20.glUniformMatrix4(super.id, false, super.data);
}

Genau gleich wie die Zeilen 2 - 4 im Kskb!

Weiter, der render code der render objects:

mesh.getVao().bind();
GL11.glDrawArrays(mode.getRawMode(), 0, mesh.getVbo().getRowCount());

So, das ganze zusammen ergibt also genau den gleichen Code wie im Kskb, nur das das Vao hier 2 mal gebindet wird. (Was aber eigentlich keinen Unterschied machen sollte?..).
Ich versteh also absolut nicht wo hier der Fehler liegen könnte. Hat jemand eine idee?

Danke fürs lesen ( = zeitnehmen), und nochmal sorry fürs crossposting !


#2

Schwer zu sagen. Anhand des (räusper) Videos bzw. der Symptome würde ich auf irgendeine Threading-Sache tippen. Kanns sein dass da vom EDT irgendwelche Uniforms umgebogen werden, während der GL-Thread die gerade zum Rendern verwendet?


#3

ja hm, und wie bekomm ich das bitte raus? (Ich könnte die qualität auch höher machen, aber das ändert ja nichts.)


#4

Im Zweifelsfall mit ein paar Debug-Ausgaben (sorry, kann es gerade nicht testen, aber denke, dass der GL-Thread bei LWJGL doch NICHT der EDT ist (außer, wenn man die AWT-GL-Components verwendet?!)… Man kommt so schnell raus… vielleicht weiß [MENTION=1500]Fancy[/MENTION] da spontan genaueres


#5

Naja, ich hatte gehofft es sei eben etwas was ein “erfahrenes auge” sofort erkennen würde.
scheint wohl nicht so, der fehler liegt wohl wieder in meiner dummheit.

Vllt, wenn fancy hier nochmal vorbeischaut:
woran kann es noch liegen, dass bei der aktualisierung einer uniform variable
(glUniformMatrix zB) eine invalid operation kommt, ausser wenn man den
buffer nicht geflippt oder das program nicht gebindet hat?


#6

Jaja, Dummheit :rolleyes: Du hattest von Mausbewegungen geredet - nimmst du da die LWJGL-Eigenen Mechanismen, oder einen MouseListener?


#7

So generell jetzt? Die Lwjgl Sachen. Auch wenn das rumspackt. aber das wäre ein thread für sich. wieso? Und wie will ich swing und lwjgl überhaupt verbinden?
Hab dazu zwar schon gesucht, aber naja… werde sowieso zusätzlich zu dieser lib (darauf basierend) ein kleines gui system aufbauen, was dann wohl mit lwjgl
arbeiten wird ^^ Aber auch das wird irgendwann ein thread für sich xD


#8

OK, DANN verstehe ich es spontan auch nicht (da ist sie wieder, die Dummheit ;-)) . Man kann AWT und LWJGL mischen, mit http://lwjgl.org/javadoc/org/lwjgl/opengl/AWTGLCanvas.html - aber eigentlich sollte das auch problemlos gehen, deswegen muss das einen anderen Grund haben. Wie immer wäre ein KSKB gut, aber … im Moment bin ich “ein bißchen offline”, d.h. könnte es nicht vor nächster Woche testen…


#9

Ist ja auch kein Ding.
Das Problem an einem Kskb ist ja - das funktioniert. der fehler liegt in meiner library, der einzige der diesen fehler finden kann bin ich, oder jemand der lust hat eine Nacht
damit zu verschwenden meinen source code zu lesen und zu verstehen… :smiley:
Aber ich schau weiter. mal sehen.


#10

Moin,

an dem bisher Geschriebenem/Gezeigtem, kann ich auch keinen Fehler erkennen.

[QUOTE=mymaksimus;94933]woran kann es noch liegen, dass bei der aktualisierung einer uniform variable
(glUniformMatrix zB) eine invalid operation kommt, ausser wenn man den
buffer nicht geflippt oder das program nicht gebindet hat?[/QUOTE]

So etwas ist in den man pages immer recht genau aufgeschlüsselt:

Viele Grüße
Fancy


#11

Hey Leute, Hey Fancy ^^
Ja, das hatte ich dann kurz nach dem ich es gefragt hatte auch gefunden, hat mir aber nicht weitergeholfen.

Ich zitiere nur: “Da ist sie wieder, die Dummheit.”

Ich hab die methode AGLShaderProgram.bind() so umgeschrieben, das es nur gebindet wird
wenn es das nicht schon ist. Naja. Was ich dabei nur vergessen hatte war glUseProgram, also das
was das ganze ausmacht, das hab ich in dieser neufassung leider vergessen, daher die ganzen
invalid opertaions die ich mir nicht erklären konnte ^^

Zu dem ursprungsproblem, und wieder lässt sich dieses Zitat anwenden.

[B]AUFGEPASST: Und hier ist die Tatsache schuld, das man methoden in interfaces public machen muss.[/B] (<- aber dazu gabs ja bereits nen thread von mir ^^)
Es gibt die Methode updateUniform(); , die ich ja nur intern aufrufbar machen wollte.
für den user gibts die methode requestUniformUpdate(); . jetzt hab ich in meinem testprogramm aber einmal
request und einmal ausversehen direkt update geschrieben, sodass es rumgebuggt hat im sinne von immer nur eins wurde
tatsächlich geupdatet, das andere nur ab und zu.

Also Leute, Danke ^^
Wenigstens antworten hier leute, nicht wie bei stackoverflow XD