2016-06-24 19 views
2

(Sorry für meine Englisch-Kenntnisse ...)Warum funktioniert diese Projektionsmatrix nicht?

tryed ich meine eigenen Shader mit GLSL #version 440 so zu schreiben, auch nur bekomme ich meine eigene Projektion Matrix verwenden, aber ich dieses: output anstelle des (der zweite ist ohne die Projektionsmatrix)

Weiß jemand den Grund für das, was passiert?

Matrix Definition:

// projectionMatrix is global defined 
void Perspective(float fovy, float aspect, float near, float far) 
{ 
    fovy = degree*90; 
    float f; 
    f = 1/tan(fovy/2); 

    projectionMatrix[0] = f/aspect; projectionMatrix[4] = 0; projectionMatrix[8] = 0;   projectionMatrix[12] = 0; 
    projectionMatrix[1] = 0;  projectionMatrix[5] = f; projectionMatrix[9] = 0;   projectionMatrix[13] = 0; 
    projectionMatrix[2] = 0;  projectionMatrix[6] = 0; projectionMatrix[10] = (far+near)/(near-far); projectionMatrix[14] = (2*far*near)/near-far; 
    projectionMatrix[3] = 0;  projectionMatrix[7] = 0; projectionMatrix[11] = -1;   projectionMatrix[15] = 1; 

    gl 

UniformMatrix4fv(posProjectionMatrix, 1, GL_TRUE, projectionMatrix); 
} 

Vertex-Shader:

#version 440 

in vec4 vertexPosition; 
in vec4 vertexColor; 

out vec4 Color; 

uniform mat4 modelMatrix; 
uniform mat4 projectionMatrix; 
uniform mat4 viewMatrix; 

void main() 
{ 
    gl_Position = projectionMatrix*vec4(vertexPosition.xyz, 1); 
    Color = vertexColor; 
} 

//END 

Wenn Sie mehr Code benötigen, fragen Sie einfach.

Antwort

2

Es gibt ein paar Fehler in der Projektionsmatrix:

projectionMatrix[14] = (2*far*near)/near-far; 

Es gibt Klammern im Ausdruck fehlt, sollte es sein:

projectionMatrix[14] = (2*far*near)/(near-far); 

Das letzte Element ist auch falsch:

Dieses Matrixelement muss 0:

sein
projectionMatrix[15] = 0.0f; 

Auch als @Nicol Bolas bereits in einer nun gelöscht Antwort darauf hingewiesen, Gebäude sind Sie die Matrix in Spaltenhauptordnung, so sollten Sie nicht das Argument glUniformMatrix4fv() verwenden, die die Matrix als Teil des Lade transponiert . Der korrekte Anruf ist:

glUniformMatrix4fv(posProjectionMatrix, 1, GL_FALSE, projectionMatrix); 
Verwandte Themen