Opengl: Kamera * Projektion * Koordinate = Blacksreen

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 :confused:
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 ^^

[QUOTE=mymaksimus]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.)
[/QUOTE]

Ist schon spät, deswegen nur ein kurzer Pointer: Wie die lookAt- und perspective-Matrizen aussehen müssen, steht in http://forum.byte-welt.net/threads/10479-LWJGL-Matrizen-(OpenGL-3-)?p=70345&viewfull=1#post70345

Hilft leider nicht :frowning:

Moin,

hast Du Dir auch den dort im Text versteckten Link angesehen? (https://gist.github.com/mschorn/a68006910aeea9f8aa95)

Ansonsten ist es bei OpenGL immer am einfachsten, wenn zur Frage ein KSKB beigelegt wird. OpenGL verwendet eine Zustandsmaschine, entsprechend kann ein Fehler praktisch überall sein.

Viele Grüße
Fancy

Ja das habe ich mir angesehen…

Aber gut ich glaube ich poste mal ein kskb. Die Sache ist die…
man kann das nicht wirklich kurz halten… und lwjgl muss man ja auch haben um es zu auszuführen…

Hier jedenfalls der Code: (Die Shader hab ich einfach als String reingepackt.
Wenn man im vertex shader [projection * camera *] weglässt, sieht man die eine
Seite des Würfels auf das ganze Fenster gestreckt.)

code
[spoiler]


import java.nio.FloatBuffer;
import java.util.ArrayList;

import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL15;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;
import org.lwjgl.util.vector.Matrix4f;
import org.lwjgl.util.vector.Vector3f;

public class Cube {
	
	private final int VERTEX_LOCATION = 0;

	private int shaderProgramID;
    private int vertexArrayObjectID;
    private int vertexBufferObjectID;
    private float vertices[];

    public Cube(){
        initDisplay();
        initShaders();
        initGl();
        startGameLoop();
    }

    private void initDisplay(){
        try{
            Display.setDisplayMode(new DisplayMode(800, 600));
            Display.create();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

    private void initShaders(){
        String vertexShaderCode = readFile("test.vert");
        String fragmentShaderCode = readFile("test.frag");

        int vertexShaderID = GL20.glCreateShader(GL20.GL_VERTEX_SHADER);
        GL20.glShaderSource(vertexShaderID, vertexShaderCode);
        GL20.glCompileShader(vertexShaderID);

        int fragmentShaderID = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);
        GL20.glShaderSource(fragmentShaderID, fragmentShaderCode);
        GL20.glCompileShader(fragmentShaderID);

        shaderProgramID = GL20.glCreateProgram();
        GL20.glAttachShader(shaderProgramID, vertexShaderID);
        GL20.glAttachShader(shaderProgramID, fragmentShaderID);

        GL20.glBindAttribLocation(shaderProgramID, VERTEX_LOCATION, "vert");
        
        GL20.glLinkProgram(shaderProgramID);
        
        GL20.glDetachShader(shaderProgramID, vertexShaderID);
        GL20.glDetachShader(shaderProgramID, fragmentShaderID);

        GL20.glUseProgram(shaderProgramID);
        Matrix4f camera = new Matrix4f();
        Matrix4f.translate(new Vector3f(0.0f, 0.0f, -0.0f), camera, camera);
        FloatBuffer buffer = BufferUtils.createFloatBuffer(16);
        camera.store(buffer);
        buffer.flip();
        GL20.glUniformMatrix4(GL20.glGetUniformLocation(shaderProgramID, "camera"), false, buffer);
        
        float zNear = 0.1f, zFar = 100.0f, top = 300, bottom = -300, left = -400, right = 400;  
        Matrix4f projection = new Matrix4f();
        projection.m00 = (2 * zNear) / (right - left);
        projection.m02 = (right + left) / (right - left);
        projection.m11 = (2 * zNear) / (top - bottom);
        projection.m12 = (top + bottom) / (top - bottom);
        projection.m22 = -(zFar + zNear) / (zFar - zNear);
        projection.m23 = -(2 * zFar * zNear) / (zFar - zNear);
        projection.m32 = -1;
        FloatBuffer buffer2 = BufferUtils.createFloatBuffer(16);
        projection.store(buffer2);
        buffer.flip();
        GL20.glUniformMatrix4(GL20.glGetUniformLocation(shaderProgramID, "projection"), false, buffer);

        int compileStatus = GL20.glGetShaderi(vertexShaderID, GL20.GL_COMPILE_STATUS);
        if (compileStatus == GL11.GL_FALSE) {
            int infoLogLength = GL20.glGetShaderi(vertexShaderID, GL20.GL_INFO_LOG_LENGTH);
            String infoLog = GL20.glGetShaderInfoLog(vertexShaderID, infoLogLength);
            throw new RuntimeException(infoLog);
        }
        System.out.println("Compile Error: " + GL20.glGetProgramInfoLog(shaderProgramID, GL20.glGetProgrami(shaderProgramID, GL20.GL_INFO_LOG_LENGTH)));
    }

    private void initGl(){
        vertices = new float[]{
                 // X     Y     Z  
        		// bottom
        	    -1.0f,-1.0f,-1.0f, 
        	     1.0f,-1.0f,-1.0f,   
        	    -1.0f,-1.0f, 1.0f,   
        	     1.0f,-1.0f,-1.0f,   
        	     1.0f,-1.0f, 1.0f,  
        	    -1.0f,-1.0f, 1.0f,  

        	    // top
        	    -1.0f, 1.0f,-1.0f,  
        	    -1.0f, 1.0f, 1.0f,   
        	     1.0f, 1.0f,-1.0f,  
        	     1.0f, 1.0f,-1.0f,  
        	    -1.0f, 1.0f, 1.0f, 
        	     1.0f, 1.0f, 1.0f,

        	    // front
        	    -1.0f,-1.0f, 1.0f,  
        	     1.0f,-1.0f, 1.0f,   
        	    -1.0f, 1.0f, 1.0f,  
        	     1.0f,-1.0f, 1.0f,  
        	     1.0f, 1.0f, 1.0f,  
        	    -1.0f, 1.0f, 1.0f,  

        	    // back
        	    -1.0f,-1.0f,-1.0f,    
        	    -1.0f, 1.0f,-1.0f,    
        	     1.0f,-1.0f,-1.0f,    
        	     1.0f,-1.0f,-1.0f,    
        	    -1.0f, 1.0f,-1.0f,   
        	     1.0f, 1.0f,-1.0f,    

        	    // left
        	    -1.0f,-1.0f, 1.0f,   
        	    -1.0f, 1.0f,-1.0f,   
        	    -1.0f,-1.0f,-1.0f,   
        	    -1.0f,-1.0f, 1.0f,   
        	    -1.0f, 1.0f, 1.0f,   
        	    -1.0f, 1.0f,-1.0f,   

        	    // right
        	     1.0f,-1.0f, 1.0f,   
        	     1.0f,-1.0f,-1.0f,   
        	     1.0f, 1.0f,-1.0f,   
        	     1.0f,-1.0f, 1.0f,   
        	     1.0f, 1.0f,-1.0f,   
        	     1.0f, 1.0f, 1.0f,   
        };
        FloatBuffer verticesBuffer = BufferUtils.createFloatBuffer(vertices.length);
        verticesBuffer.put(vertices);
        verticesBuffer.flip(); 

        vertexArrayObjectID = GL30.glGenVertexArrays();
        GL30.glBindVertexArray(vertexArrayObjectID);

        vertexBufferObjectID = GL15.glGenBuffers();
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vertexBufferObjectID);
        GL15.glBufferData(GL15.GL_ARRAY_BUFFER, verticesBuffer, GL15.GL_STATIC_DRAW);

        GL20.glEnableVertexAttribArray(VERTEX_LOCATION);
        GL20.glVertexAttribPointer(VERTEX_LOCATION, 3, GL11.GL_FLOAT, false, 0, 0);
        
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
        GL30.glBindVertexArray(0);
        
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    }

    private void startGameLoop(){
    	long lastFrame = System.nanoTime();
    	long thisFrame = System.nanoTime();
    	
    	long lastTime = System.nanoTime();
    	ArrayList<Long> fpsCollection = new ArrayList<>();
    	
    	long delta;
    	int mid = 0, min = Integer.MAX_VALUE, max = 0;   	
    	
    	float alpha = 0.0f;
    	
    	while(!Display.isCloseRequested()){
    		thisFrame = System.nanoTime();
    		delta = thisFrame - lastFrame;
    		lastFrame = thisFrame;
    		GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
            GL11.glClearColor(0, 0, 0, 1);
            GL20.glUseProgram(shaderProgramID);
            GL30.glBindVertexArray(vertexArrayObjectID);
            GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, 6 * 2 * 3);
            GL30.glBindVertexArray(0);
            GL20.glUseProgram(0);
            double fpsRaw = (1e9 / delta);
            int fps = (int) fpsRaw;
            if(min != 0 && fps < min){
            	min = fps;
            }
            if(fps > max){
            	max = fps;
            }
    		if(alpha < 1){
    			alpha += 0.001f;
    		}
    		if(thisFrame / 1e9 - lastTime / 1e9 >= 1){
    			lastTime = thisFrame;
    			fpsCollection.add((long) fps);
    			mid = calcMid(fpsCollection);
    		}
    		Display.setTitle("mid: " + mid + " | min: " + min + " | max: " + max + " | now: " + fps + "");
            Display.update();
        }
        destroy();
    }
    
    public int calcMid(ArrayList<Long> fpsCollection){
    	long lm = 0;
    	for(long l : fpsCollection){
    		lm+=l;
    	}
    	return (int) lm / fpsCollection.size();
    }

    private void destroy(){
        GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
        GL15.glDeleteBuffers(vertexBufferObjectID);

        GL30.glBindVertexArray(0);
        GL30.glDeleteVertexArrays(vertexArrayObjectID);

        Display.destroy();
    }

    public String readFile(String fileName){
        if(fileName.endsWith(".frag")){
        	return "#version 120
"+
        		   "void main(void){
"+
        		   "gl_FragColor = vec4(1, 0, 0, 1);
"+
        		   "}";
        }
        else {
        	return "#version 120
"+
        			"uniform mat4 projection;
"+
        			"uniform mat4 camera;
"+
        			"attribute vec3 vert;
"+
        			"void main() {
"+
        			"gl_Position = projection * camera * vec4(vert, 1);
"+
        			"}";
        }
        /*
    	try{
            BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getClassLoader().getResourceAsStream(fileName)));
            String content = "";
            String line;
            while((line = reader.readLine()) != null){
                content += line + "
";
            }
            return content;
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
        */
    }

    public static void main(String[] args) {
    	System.setProperty("org.lwjgl.util.Debug", "true");
    	new Cube();
    }
}```
[/spoiler]


*** Edit ***

Und ja, 3D mit einer Farbe macht nicht viel Sinn (xD), hab die Textur aber mal des kskbs wegen mal rausgenommen ^^

*** Edit ***

hab hier noch was zu projektion gefunden.. wieder was ganz anderes... klappt aber auch nicht...

http://www.scratchapixel.com/lessons/3d-advanced-lessons/perspective-and-orthographic-projection-matrix/perspective-projection-matrix/

er meint in seinem code beispiel nur punkte seien zu sehen die im bereich -1 1 sind, aber das ist mein Würfel doch... wieso sehe ich nichts.. :ka:

*** Edit ***

GLU.gluPerspective() hat folgenden Code... jetzt check ich gar nichts mehr...

```public static void More ...gluPerspective(float fovy, float aspect, float zNear, float zFar) {
197		float sine, cotangent, deltaZ;
198		float radians = fovy / 2 * GLU.PI / 180;
199
200		deltaZ = zFar - zNear;
201		sine = (float) Math.sin(radians);
202
203		if ((deltaZ == 0) || (sine == 0) || (aspect == 0)) {
204			return;
205		}
206
207		cotangent = (float) Math.cos(radians) / sine;
208
209		__gluMakeIdentityf(matrix);
210
211		matrix.put(0 * 4 + 0, cotangent / aspect);
212		matrix.put(1 * 4 + 1, cotangent);
213		matrix.put(2 * 4 + 2, - (zFar + zNear) / deltaZ);
214		matrix.put(2 * 4 + 3, -1);
215		matrix.put(3 * 4 + 2, -2 * zNear * zFar / deltaZ);
216		matrix.put(3 * 4 + 3, 0);
217
218		glMultMatrix(matrix);
219	}```

und GLU.lookAt(), ich dachte die Camera Matrix ist einfach nur mat.translate(irgendwohin), aber nein, look at macht folgendes:

```public static void More ...gluLookAt(
235		float eyex,
236		float eyey,
237		float eyez,
238		float centerx,
239		float centery,
240		float centerz,
241		float upx,
242		float upy,
243		float upz) {
244		float[] forward = Project.forward;
245		float[] side = Project.side;
246		float[] up = Project.up;
247
248		forward[0] = centerx - eyex;
249		forward[1] = centery - eyey;
250		forward[2] = centerz - eyez;
251
252		up[0] = upx;
253		up[1] = upy;
254		up[2] = upz;
255
256		normalize(forward);
257
258		/* Side = forward x up */
259		cross(forward, up, side);
260		normalize(side);
261
262		/* Recompute up as: up = side x forward */
263		cross(side, forward, up);
264
265		__gluMakeIdentityf(matrix);
266		matrix.put(0 * 4 + 0, side[0]);
267		matrix.put(1 * 4 + 0, side[1]);
268		matrix.put(2 * 4 + 0, side[2]);
269
270		matrix.put(0 * 4 + 1, up[0]);
271		matrix.put(1 * 4 + 1, up[1]);
272		matrix.put(2 * 4 + 1, up[2]);
273
274		matrix.put(0 * 4 + 2, -forward[0]);
275		matrix.put(1 * 4 + 2, -forward[1]);
276		matrix.put(2 * 4 + 2, -forward[2]);
277
278		glMultMatrix(matrix);
279		glTranslatef(-eyex, -eyey, -eyez);
280	}```


.... hat jemand eine ahnung was ist jetzt tun sollte / könnte ? xD

*** Edit ***

Quelle: http://grepcode.com/file/repo1.maven.org/maven2/org.lwjgl.lwjgl/lwjgl_util/2.8.0/org/lwjgl/util/glu/Project.java#Project.gluPerspective%28float%2Cfloat%2Cfloat%2Cfloat%29

Und woran hapert es?

Ansonsten:

        Matrix4f.translate(new Vector3f(0.0f, 0.0f, -1.5f), camera, camera); // <--
        final FloatBuffer buffer = BufferUtils.createFloatBuffer(16);
        camera.store(buffer);
        buffer.flip();
        GL20.glUniformMatrix4(GL20.glGetUniformLocation(shaderProgramID, "camera"), false, buffer);

        final float zNear = 0.1f, zFar = 100.0f, top = 1, bottom = -1, left = -1, right = 1; // <--
        final Matrix4f projection = new Matrix4f();
        projection.m00 = (2 * zNear) / (right - left);
        projection.m02 = (right + left) / (right - left);
        projection.m11 = (2 * zNear) / (top - bottom);
        projection.m12 = (top + bottom) / (top - bottom);
        projection.m22 = -(zFar + zNear) / (zFar - zNear);
        projection.m23 = -(2 * zFar * zNear) / (zFar - zNear);
        projection.m32 = -1;
        projection.m33 = 0;
        final FloatBuffer buffer2 = BufferUtils.createFloatBuffer(16);
        projection.store(buffer2);
        buffer2.flip(); // <--
        GL20.glUniformMatrix4(GL20.glGetUniformLocation(shaderProgramID, "projection"), true, buffer2); // <--```

Wenn Du das änderst, siehst Du wieder eine Seite des Würfels.

Edit: m33 hinzugefügt.

Viele Grüße
Fancy

Bin grad nicht zuhause aber - o m g…
das kommt davon - buffer und buffer2… sprechende namen und so… anfänger fehler… richtig peinlich gerade… xD
Danke dir :smiley: Hoffe mal das klappt auch bei mir… xD

*** Edit ***

Ok so, das klappt jetzt tatsächlich vielen dank dir. Ich glaub ich wär nie drauf gekommen… (headbang)…
aber folgendes:

was bringt bei der uniform setzung der boolean „transpose“ ? Der Source Code von GL20 sagt nicht viel, wird halt die native aufgerufen.
transpose heißt ja vertauschen… was wird da vertauscht, und wieso soll die camera matrix das nicht haben?

Dann: Wieso ist der „Würfel“ Immer noch gestreckt? Ich muss doch irgendwo aspect, (also width / height) angeben, wo / wie mach ich das?

Danke!

Die beiden 4x4 Matrizen werden jeweils in einem eindimensionalen Array/Buffer abgelegt. Das kann man zeilenweise oder spaltenweise machen. So wie Du die Matrix aufbaust, wäre das zeilenweise. OpenGL erwartet Matrizen aber immer spaltenweise. Das transpose tauscht den Inhalt des Buffers während der Übertragung, Zeilen werden so zu Spalten. Beim Matrix4f.translate wird intern schon spaltenweise gespeichert, deshalb muss dort nichts getauscht werden.

Statt dem transpose kannst Du auch die m?? passend vertauschen/setzen, wenn viele Daten übertragen werden ist das effizienter, da OpenGL dies nicht mehr machen muss.

Das Aspect würde über die top/bottom in die Matrix einfließen. Also z.B. -1/+1 für left/right und -0.6/+0.6 für top/bottom. Eingängiger finde ich die perspetiveMatrix aus dem anderen Thread (http://forum.byte-welt.net/threads/10479-LWJGL-Matrizen-(OpenGL-3-)?p=70345&viewfull=1#post70345). Diese solltest Du problemlos in Deinen Code übernehmen können. Dort wird schon spaltenweise gespeichert, also kein transpose. Sinnvolle Werte wären z.B. 100 , (float) Display.getWidth() / (float) Display.getHeight(), 0.1f, 100.0f.

Viele Grüße
Fancy

Okay, vielen dank!
Aber ich hab erstmal ein anderes Problem:

Ab und zu wird eine ist eine bestimmte Seite des Würfels einfach nicht sichtbar. Woran mag das liegen?

Transparente Texturen? Ja, da haut der Z-Buffer dazwischen: Es werden normalerweise nur die Pixel gesetzt, die weiter vorne sind. In diesem Fall “erkennt” er: “Oh, die Front-Fläche hab’ ich schon gemalt, die linke Seite ist weiter hinten, das kann ich mir sparen”. Dass er damit bei transparenten Texturen falsch liegt, ist ein allgemeines Problem. Umgehen kann man das AFAIK nur mit einigem Aufwand. Sinngemäß: Man muss den Z-Buffer abschalten, und alle Punkte von hinten nach vorne sortiert malen. Nicht trivial. Das Stichwort wäre http://en.wikipedia.org/wiki/Order-independent_transparency oder sowas wie http://blog.icare3d.org/2010/06/fast-and-accurate-single-pass-buffer.html , aber … kann gut sein dass es bei OpenGL 4.3 eine magische extension gibt wie “nv_ext_draw_this_stuff_right”, die man einschalten kann, indem man irgendein flag auf ‘true’ setzt (aber ich glaube eher nicht :D). Da wird Fancy sicher noch genaueres dazu sagen können.

okay ich schau mal bei den links… aber… ich dachte das wäre trivial o.O
Naja. Das Problem erkenn ich jetzt, stimmt…

[ @Fancy , damit der hier nochmal reinschaut :P]

*** Edit ***

Ich kann nicht höher gehen als opengl 3.0 oder 3.1. Kompatibiilität, allein mein privater laptop…

*** Edit ***

Ach ja und: Wenn man in einer Welt zum Beispiel ein Fenster eines Hauses oder so hat: Dann muss doch eigentlich nur die Textur des Fensters teiltransparent sein? oder nicht? Oder könnte es so passieren das ein Gegner hinter dem Fenster quasi unsichtbar wäre?:.

[QUOTE=mymaksimus]
Ach ja und: Wenn man in einer Welt zum Beispiel ein Fenster eines Hauses oder so hat: Dann muss doch eigentlich nur die Textur des Fensters teiltransparent sein? oder nicht? Oder könnte es so passieren das ein Gegner hinter dem Fenster quasi unsichtbar wäre?:.[/QUOTE]

Ja, das könnte passieren. Üblicherweise muss sowas wie ein Fenster “echt geometrisch” modelliert sein - also als Loch in der Geometrie.

das heißt das das fenster gar nicht zur restlichen welt gehört oder wie?

Hm?! Das kapier ich jetzt nicht. Die Fenster von deinem Haus sind ja auch erstmal Löcher in der Wand, und nicht eine Wand wo du durchsichtige Folie draufgeklebt hast :smiley: Ich hab’ so ein Bauchgefühl, worauf das rausläuft: Wenn du „komplexere“ Objekte modellieren willst, dann wirst du das nicht mit hartgecodeten float houseCoordinates[] = { 0.2f, 1.3f, ...} und float houseIndices[] = { 0, 5, 3, ...} machen können. Stattdessen könntest du die Objekte (zusammen mit ihren Texturkoordinaten) mit einem passenden Programm erstellen und in irgendeinem einfach lesbaren Format speichern (.OBJ ist der Klassiker, kann jeder lesen und schreiben).

Mhm ja stimmt. Ging mir jetzt eigentlich eher ums verstaendniss. Aber… zB bei minecraft lassen sich glasbloecke ja uberall hinsetzen… hast du ne ahnung wie die transparenz dann dort gerendert wird?

Lesenswert ist auch https://www.opengl.org/wiki/Transparency_Sorting

Transparenz ist leider nicht einfach. Und wie Marco schon schrieb, müsste man die Dreiecke der Tiefe nach sortieren, das ist aber hässlich, da man die Geometrie zur Laufzeit eigentlich nicht anfassen will.

Je nach gewünschtem Effekt kann es aber Vereinfachungen geben. Oft ist das Ergebnis z.B. ausreichend, wenn man zuerst alle undurchsichtigen Dreiecke zeichnet und dann alle transparenten (unsortiert) mit glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA).

Ein anderer Fall ist, wenn man einfach nur Löcher in die Geometrie stanzen will, dann bietet sich das discard im Fragment Shader an.

Unabhängig davon, wenn Du etwas wie Minecraft vorhast, solltest Du Instancing einplanen. Das gibt es ab OpenGL 3.1. Ein Beispiel dazu gibt es hier, das ist OpenGL 4 sollte sich aber auf OpenGL 3.1 zurückportieren lassen.

Viele Grüße
Fancy

Um den obrigen Würfel samt textur korrekt darzustellen sollte ein alpha discard genügen:

Im vertex shader:


vec4 color=texture(colorMap,texCoord);
if(color.a>0.1){
  discard;
}

Das geht natürlich nicht texturen mit halb transparenten pixeln, wie zb. Fenster usw.

haha nein ich hab nicht vor mc nachzuprogrammieren… :wink:
Ich denke nur minecraft ist das passendste Beispiel, für mich am einfachsten zu erklären was ich will, und außerdem sind würfel nun mal das womit man hier anfängt ^^
Letzendlich ist aber ein 2d Projekt in Planung, naja, die Techniken bleiben ja trozdem…

Okay, ich probiers mal mit dem discard - was auch immer das heißt, ich googel mal.
Ansonsten kehre ich wahrscheinlich zu diesem Problem zurück sobald ichs wirklich brauche.

discard macht eigentlich genau das nach was es klingt, es verwirft den Pixel der gerade bearbeitet wird. Dadurch wird auch kein Wert in den DepthBuffer geschrieben…
Falls du dann immer noch nicht die hintere Textur siehst hast du wahrscheinlich noch BackFaceCulling eingeschaltet

texture(tex, vertTexCoord)

kann ich nicht im vertex ausführen, da glsl 120. “Global function not irgendwas”.
Ne andere möglichkeit?

*** Edit ***

und discard gibts da wohl auch noch nicht.