OpenGL орто-, перспективные и усеченные проекции

45Я пытаюсь понять проекции OpenGL в одной точке. Я использую QGLWidget для контекста рендеринга и QMatrix4x4 для проекционной матрицы. Вот функция рисования

    attribute vec4 vPosition;      
        uniform mat4 projection;  
        uniform mat4 modelView; 
        void main()
        {
          gl_Position = projection* vPosition;
        }       

        void OpenGLView::Draw()
        {
           glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    glUseProgram(programObject);
    glViewport(0, 0, width(), height());

    qreal aspect = (qreal)800 / ((qreal)600);
    const qreal zNear = 3.0f, zFar = 7.0f, fov = 45.0f;

    QMatrix4x4 projection;
    projection.setToIdentity();
    projection.ortho(-1.0f,1.0f,-1.0f,1.0f,-20.0f,20.0f);
   // projection.frustum(-1.0f,1.0f,-1.0f,1.0f,-20.0f,20.0f);
   // projection.perspective(fov,aspect,zNear, zFar);

   position.setToIdentity();
   position.translate(0.0f, 0.0f, -5.0f);
   position.rotate(0,0,0, 0);

    QMatrix4x4 mvpMatrix =   projection * position;

    for (int r=0; r<4; r++)
        for (int c=0; c<4; c++)
            tempMat[r][c] = mvpMatrix.constData()[ r*4 + c ];

    glUniformMatrix4fv(projection, 1, GL_FALSE, (float*)&tempMat[0][0]);

    //Draw point at 0,0
    GLfloat f_RefPoint[2];
    glUniform4f(color,1, 0,1,1);
    glPointSize(15);
    f_RefPoint[0] = 0;
    f_RefPoint[1] = 0;
    glEnableVertexAttribArray(vertexLoc);
    glVertexAttribPointer(vertexLoc, 2, GL_FLOAT, 0, 0, f_RefPoint);
    glDrawArrays (GL_POINTS, 0, 1);            
        }

Наблюдения:

1) проекция.орто: точка, отображаемая в окне, и перевод точки с другим значением оси Z не влияет

2) project.frustum: точка рисуется в окне, только точка переводится как translate(0.0f, 0.0f, -20.0f)

3) проекция.перспектива: точка никогда не отображается на экране.

Может ли кто-нибудь помочь мне понять это поведение?


person Keen Learner    schedule 11.02.2014    source источник


Ответы (1)


  1. Ортопроекция работает таким образом. Я предлагаю вам поискать несколько изображений или видео о различиях между разными проекциями.
  2. Я не знаю, как вы видите перемещение точки в координате Z, но если бы у вас был квадрат, он стал бы меньше, если бы переместил его дальше (с орто-ориентацией он остался бы прежним). Здесь возникает проблема, поскольку вы используете -20.0f для zNear, в то время как это значение должен быть положительным. Значения, вставленные в этот метод, в большинстве случаев должны генерироваться с полем зрения, соотношением сторон. .. В любом случае вы не сможете увидеть ничего ближе zNear и ничего дальше zFar.
  3. Это то же самое, что и усеченная пирамида, но уже принимает такие параметры, как поле зрения, соотношение сторон. Причина, по которой вы ничего не видите, заключается в том, что ваш zNear находится на расстоянии 3,0f, а точка находится на расстоянии 0,0f. Переместив точку, вы сможете ее увидеть, но попробуйте перевести ее на любое расстояние от 3.0f до 7.0f (3.0f — это ваш zNear, а 7.0f — ваш zFar). Альтернативой является увеличение zFar или перевод матрицы проекции в обратном направлении. Или, в основном, в вашем случае я предлагаю добавить некоторую систему «взгляда» на матрицу проекции, поскольку она даст вам несколько простых в использовании инструментов для управления вашей «камерой», в большинстве случаев вы можете установить точку, с которой вы смотрите, точка, на которую вы смотрите, и восходящий вектор.
person Matic Oblak    schedule 12.02.2014