Hey Leute.
Ich hab jetzt tatsächlich angefangen Opengl zu lernen.
Nutze für die Grundlagen erstmal das hier: http://tomdalling.com/blog/category/modern-opengl/
[Die Sachen die mir im damaligen Thread empfohlen wurden werde mir natürlich auch ansehen, aber erstmal das.]
Momentan bin ich beim dritten Teil: Matrices, Depth Buffering, Animation.
Es geht darum einen Würfel auf den Bildschirm zu zaubern und mithilfe von matrizen zu verschieben rotieren und so weiter.
Leider tritt aber das im Titel genannte ein.
Ich denke das es an etwas ganz einfachem und dummen liegt, ich es aber einfach nur nicht entdecke.
Dieser Fall ist naheliegend, aber naja, ich komm eben wirklich nicht weiter ^^
Also: Der Vertex Shader macht positionsmäßig folgendes: gl_Position = projection * camera * vec4(vert, 1);
[Der Rest ist richtig. Ohne projection * camera * funktioniert alles, ich seh aber natürlich nur die vorderste Seite des Würfels, und diese gestreckt.]
Die Würfel + Texture Koordinaten (aus dem Tutorial abgeschrieben) sind folgende:
vertices
[spoiler]
vertices = new float[]{
// X Y Z U(S)[x] V(T)[y]
// bottom
-1.0f,-1.0f,-1.0f, 0.0f, 0.0f,
1.0f,-1.0f,-1.0f, 1.0f, 0.0f,
-1.0f,-1.0f, 1.0f, 0.0f, 1.0f,
1.0f,-1.0f,-1.0f, 1.0f, 0.0f,
1.0f,-1.0f, 1.0f, 1.0f, 1.0f,
-1.0f,-1.0f, 1.0f, 0.0f, 1.0f,
// top
-1.0f, 1.0f,-1.0f, 0.0f, 0.0f,
-1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
1.0f, 1.0f,-1.0f, 1.0f, 0.0f,
1.0f, 1.0f,-1.0f, 1.0f, 0.0f,
-1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
// front
-1.0f,-1.0f, 1.0f, 1.0f, 0.0f,
1.0f,-1.0f, 1.0f, 0.0f, 0.0f,
-1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f, 0.0f, 0.0f,
1.0f, 1.0f, 1.0f, 0.0f, 1.0f,
-1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
// back
-1.0f,-1.0f,-1.0f, 0.0f, 0.0f,
-1.0f, 1.0f,-1.0f, 0.0f, 1.0f,
1.0f,-1.0f,-1.0f, 1.0f, 0.0f,
1.0f,-1.0f,-1.0f, 1.0f, 0.0f,
-1.0f, 1.0f,-1.0f, 0.0f, 1.0f,
1.0f, 1.0f,-1.0f, 1.0f, 1.0f,
// left
-1.0f,-1.0f, 1.0f, 0.0f, 1.0f,
-1.0f, 1.0f,-1.0f, 1.0f, 0.0f,
-1.0f,-1.0f,-1.0f, 0.0f, 0.0f,
-1.0f,-1.0f, 1.0f, 0.0f, 1.0f,
-1.0f, 1.0f, 1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f, 1.0f, 0.0f,
// right
1.0f,-1.0f, 1.0f, 1.0f, 1.0f,
1.0f,-1.0f,-1.0f, 1.0f, 0.0f,
1.0f, 1.0f,-1.0f, 0.0f, 0.0f,
1.0f,-1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f, 0.0f, 0.0f,
1.0f, 1.0f, 1.0f, 0.0f, 1.0f
};
[/spoiler]
Und hier ist mein Code zur Matrix initialisierung. Ich denke an dieser Stelle hab ich etwas falsch gemacht, ganz wahrscheinlich sogar bei den werten
der Projektionsmatrix für left, right, top und bottom. Ich versteh nicht ganz was da rein soll, irgendwo hab ich gelesen es soll die Fenstergröße sein…
Die Kamera Matrix ist wahrscheinlich auf völlig falsch
Das Problem ist das der Typ im Tutorial folgendes verwendet: glm::lookAt(glm::vec3(3,3,3), glm::vec3(0,0,0), glm::vec3(0,1,0));
und für die Projektion: glm::perspective<float>(50.0, SCREEN_SIZE.x/SCREEN_SIZE.y, 0.1, 10.0);
Ich hab es nicht geschafft herauszufinden was diese Methoden für eine Matri erzeugen. Außerdem ist offensichtlich das er hier nicht mit left,right,bottom top
sondern mit fov aspect und sonstwas arbeitet. (Ist auch im Text zu lesen.)
Nun ja, hier ist also mein Code:
matrix initialization
[spoiler]
Matrix4f camera = new Matrix4f();
Matrix4f.translate(new Vector3f(0, 0, 0), camera, camera);
FloatBuffer buffer = BufferUtils.createFloatBuffer(16);
camera.store(buffer);
buffer.flip();
GL20.glUniformMatrix2(GL20.glGetUniformLocation(shaderProgramID, "camera"), false, buffer);
GL20.glUseProgram(0);
float zNear = 0.1f, zFar = 100.0f, top = 300, bottom = -300, left = -400, right = 400;
Matrix4f projection = new Matrix4f();
projection.m00 = 2 / (right - left);
projection.m30 = -(right + left) / (right - left);
projection.m11 = 2 / (top - bottom);
projection.m31 = -(top + bottom) / (top - bottom);
projection.m22 = -2 / (zFar - zNear);
projection.m32 = -(zFar + zNear) / (zFar - zNear);
FloatBuffer buffer2 = BufferUtils.createFloatBuffer(16);
projection.store(buffer2);
buffer.flip();
GL20.glUniformMatrix2(GL20.glGetUniformLocation(shaderProgramID, "projection"), false, buffer);
GL20.glUseProgram(0);```
[/spoiler]
Am draw befehl sollte es eigentlich nicht liegen: `GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 6 * 2 * 3);`
Also, hat jemand eine Idee, beziehungs weise kann mir sagen was genau in diese Felder rein soll?
[An Marco13, Spacerat und so weiter, alle die mir damals beim 3d mit rohem Java geholfen haben, ich weiß das wurde alles
schon 1000 mal durchgekaut... aber ich werde die entsprechenden posts wohl eh nicht mehr finden, und außerdem versteh ich
es ja mittlerweile, nur versteh nicht warum die werte nicht funktionieren.. jedenfalls sry das ich wieder "von vorn" anfange ^^]
Ich hab das ganze bei stackoverflow auch nochmal gepostet, ich meld mich natürlich wenn dort jemand die Lösung hat.
Vielen Dank fürs lesen ^^