Ich versuche etwas völlig Einfaches zu tun und werde unglaublich frustriert. Ich habe einen trivialen Vertex-Shader aufgebaut, da anscheinend man einen braucht OpenGL zu bekommen etwas heute oder die gefürchteten deprecation Götter dich an oder etwas Stirnrunzeln zu tun:Wie sage ich OpenGL, um eine Shaderuniform sofort zu aktualisieren?
#version 110
uniform mat4 scene_matrix;
attribute vec4 a_position;
void main()
{
gl_Position = scene_matrix * a_position;
}
Wunderbar. Nachdem ich 10 Stunden lang herumgespuckt habe, um eine geeignete Matrix zu erstellen, gebe ich sie mit glUniformMatrix4
in den Shader und es funktioniert prächtig. Das heißt, bis ich mehr als eine Sache wiedergeben möchte.
Also mein Ziel ist: Für jedes Objekt in der Szene berechne ich die entsprechende Welt-Matrix basierend auf den Koordinaten des Objekts, rufen Sie , um den Vertex-Shader über die Matrix, rufen Sie glBegin()
, dann zeichnen Sie das dumme Objekt, und rufen Sie glEnd()
. Unglücklicherweise ist es pathetisch, alle Objekte an demselben dummen Ort (dem Ort des letzten Objekts) zu zeichnen. Offensichtlich puffert er Dinge und puffert den Vertex-Shader nicht bis zum Ende, wenn er alles über die vorherigen Matrizen vergessen hat. Aber wie sage ich es, das nicht zu tun?
FloatBuffer matrixBuf = ByteBuffer.allocateDirect(16 * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();
for (int i = 0; i < 500; i++) {
matrixBuf.rewind();
matrices.world.translate(0.1, 0.1, 0.5);
matrices.calc();
matrices.combined.put(matrixBuf);
matrixBuf.rewind();
glUniformMatrix4(glGetUniformLocation(programId, "scene_matrix"), false, matrixBuf);
glBegin(GL_TRIANGLES);
{
//final int T = 1;
final float z = 0f;
final float R = 0.5f;
//glVertexAttrib2f(T, 0, 1);
glVertex3f(-R, -R, z);
//glVertexAttrib2f(T, 1, 0);
glVertex3f(R, R, z);
//glVertexAttrib2f(T, 0, 0);
glVertex3f(-R, R, z);
/*//glVertexAttrib2f(T, 0, 1);
glVertex3f(-R, -R, z);
//glVertexAttrib2f(T, 1, 1);
glVertex3f(R, -R, z);
//glVertexAttrib2f(T, 1, 0);
glVertex3f(R, R, z);*/
}
glEnd();
//glFlush(); // without this, all the triangles are in the same place
}
Ich entdeckte, dass glFlush()
nach jedem glEnd()
löst das Problem nennen. Dies verursacht jedoch ein Leistungsproblem. Ich zeichne nur 500 Objekte (jedes ein einziges bemitleidenswertes Dreieck) und es reicht bereits die CPU aus und es kommt Kondensatorweinerl aus dem Computer. Es fühlt sich falsch an. Ich bin sicher, glFlush()
muss übertrieben sein.
Ich fand, dass das Programm erneut mit glLinkProgram(programId);
nach jeder kann auch das Problem lösen, aber es ist eine Größenordnung langsamer noch.
Ich habe überall gesucht. Ich möchte nur wissen, was der Name der Funktion, die verwendet wird, um zu sagen, es zu bekommen und den Vertex-Shader jetzt ausführen, so dass ich die Uniformen für das nächste Objekt neu konfigurieren kann.
Oder ist das nicht, was ich tun soll? Soll ich die Vertexpipeline aufgeben, alle Matrixtransformationen von Vertices auf der Java-Seite durchführen und bereits transformierte Vertices einlesen? Sollte ich mich dem depreyation devil hingeben und den legalen OpenGL-Matrix-Stack verwenden, um zu sehen, ob das kooperativer ist? Jede Hilfe wird geschätzt.
Neue einheitliche Werte für die nächste Ziehung Aufruf verwendet werden, nichts, was Sie über es zu tun. Dies sieht wie ein Fehler in der OpenGL-Implementierung aus. –
@RetoKoradi: Ist es sogar erforderlich, die programmierbaren API-Aufrufe mit der Fixed-Funktion zu synchronisieren? – ybungalobill
@RetoKoradi Wenn das stimmt, würde ich es als eine Antwort akzeptieren. Das ist es, was ich frage, und ich konnte es in der Dokumentation nicht finden. – Boann