2013-04-24 2 views
0

Я новый феномен разделения перспективы. Я рендеринга простой квадрат в 3D-пространстве, используя следующий код:Перспективная матрица проекции в OpenGL

void MatrixPersp(Mat4& matrix,const float fovy, const float aspect, const float zNear, const float zFar) 
    { 
     float sine, cotangent, deltaZ; 
     float radians; 

     for(int i=0;i<4;i++) 
      for(int j=0;j<4;j++) 
      { 
       if(i==j) 
        matrix[i][j]=1.0; 
       else 
        matrix[i][j]=0.0; 
      } 

     radians = fovy/2 * GLES_Pi/180; 

     deltaZ = zFar - zNear; 
     sine = (float) sin(radians); 

     cotangent = (float) cos(radians)/sine; 

     matrix[0][0] = cotangent/aspect; 
     matrix[1][1] = cotangent; 
     matrix[2][2] = -(zFar + zNear)/deltaZ; 
     matrix[2][3] = -1; 
     matrix[3][2] = -2 * zNear * zFar/deltaZ; 
     matrix[3][3] = 0; 

     return;  
    } 

void Render() 
{ 
    GLfloat vertices[] = 
    { 
     -0.8,0.6,1.0,1.0, 
     -0.8,0.2,1.0,1.0, 
     0.2,0.2,1.0,1.0, 
     0.2,0.6,1.0,1.0 
    }; 

    MatrixPersp(perspective,90.0,aspect,2.0,100.0); 

    glUniformMatrix4fv(glGetUniformLocation(program_object,"MVPMatrix"), 1, GL_FALSE, (GLfloat*)perspective); 

    glClearDepth(1.0f); 
    glClear(GL_DEPTH_BUFFER_BIT); 

    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL); 


glDrawElements(); 

}

вершинного шейдера:

#version 150 

in vec4 position; 

uniform mat4 MVPMatrix; 

void main() 
{ 
     gl_Position = position*MVPMatrix; 

} 

Проблема здесь состоит в том, что, когда все четыре вершины имеют тот же г -значение ничего не получается вообще. С другой стороны, если две вершины имеют -1 в качестве z-координаты, проекционная матрица работает нормально. Я не уверен, что здесь происходит не так.

ответ

2
glUniformMatrix4fv(glGetUniformLocation(program_object,"MVPMatrix"), 1, GL_FALSE, (GLfloat*)perspective); 

Эта строка предполагает, что ваша матрица находится в главном порядке. Это подтверждается тем, как функция MatrixPersp вычисляет ее матрицу, в зависимости от того, как именно определяется Mat4.

gl_Position = position*MVPMatrix; 

Если MVPMatrix правильно столбцы, то это умножение назад. Положение направо.

+0

: Исправлено положение справа. Нет успеха. – maverick9888

+2

@ maverick9888 Что-то должно было измениться. Произошла ли * ошибка * или произошло что-то новое? – Hydronium

+0

@Hydronium: К сожалению, в шейдерной компиляции нет ошибки. Ничего нового не произошло :-( – maverick9888

Смежные вопросы