JOGL Shader Anfängerprobleme

  • Themenstarter Themenstarter AllquantorX
  • Beginndatum Beginndatum
A

AllquantorX

Gast
Hallo,

ich fange gerdae an, micht mit VBOs in JOGL zu beschäftigen. Nun habe ich folgendes Problem und es gelingt mir nicht, das Problem zu finden.

Es light ein kleines Mini-Program vor, das ein Dreick auf dem Bildschirm zeichnet. Ich wollte folgenden Vertex Shader zum Testen einsetzen:

uniform mat4 projection;
uniform mat4 modelView;
in vec3 position;
void main(void) {
gl_Position = projection * modelView * vec4(position, 1.0);
}

Nach Aufbau / Kompilation / Zuweisung des Shaders und des Programms hole ich mir locations für die beiden Matrizen um diese zu setzen.

Java:
projMatrixHandle = gl.glGetUniformLocation(shaderProgram, "projMatrix");
viewMatrixHandle = gl.glGetUniformLocation(shaderProgram, "viewMatrix");

Das klappt soweit und ich bekomme gültige Werte (>0). Einen glError hagelt es auch nicht. Nun wollte ich testweise eine Identiätsmatrix übergeben, doch dann wird das Dreieck wird nicht mehr angezeigt (ohne das glError etwas meldet). Übergebe ich nichts, wird natürlich auch nichts angezeigt. Nehme ich im Shader die Multiplikation mit den beiden Matrizen raus, klappt wieder alles. Müsste ich nicht bei der Übgabe von Identitäts-Matrizen alles normal sehen müssen (sowie als wenn ich keine Multiplikation im Shader ausführe)?

Java:
@Override
public void display(GLAutoDrawable drawable) {
		GL3 gl = drawable.getGL().getGL3();
		gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
		float[] identity_matrix = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, };
		gl.glUniformMatrix4fv(projMatrixHandle, 1, false, identity_matrix, 0);
		gl.glUniformMatrix4fv(viewMatrixHandle, 1, false, identity_matrix, 0);
		gl.glEnableVertexAttribArray(0);
		gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vertexHandle);
		gl.glVertexAttribPointer(0, 3, GL.GL_FLOAT, false, 0, 0);
		gl.glDrawArrays(GL.GL_TRIANGLES, 0, 3);
		gl.glBindBuffer(GL.GL_ARRAY_BUFFER, 0);
		gl.glFlush();
}
 
Update: der Shader war vom falschen Beispiel kopiert:

Java:
uniform mat4 projMatrix;
uniform mat4 viewMatrix;
in vec3 position;
void main(void) {
gl_Position = projMatrix * viewMatrix* vec4(position, 1.0);
}

Aber wie gesagt, es tut leider nichts.
 
In solchen Fällen ist es immer sinnvoll ein kleines komplettes ausführbares Stück Quellcode hier zu posten (KSKB), sodass man das schnell in seine eigene IDE kopieren kann und ausprobieren kann.

Das "Problem" bei OpenGL ist, das es eine Zustandsmaschine ist, sprich das fehlerhafte Verhalten kann irgendwo ausgelöst werden und bleibt dann bestehen, bis etwas Gültiges gesetzt wird. Sieht man den kompletten Quellcode, muss man nicht raten, sondern sieht den Fehler viel schneller.

Viele Grüße
Fancy
 

Zurück
Oben