OpenGL ortho,perspective和frustum投影

时间:2014-02-11 15:15:52

标签: opengl-es qglwidget

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)projection.ortho:在窗口上渲染并用不同的z轴值平移点的点没有效果

2)projection.frustum:该点在windown上绘制,只有该点被翻译为translate(0.0f,0.0f,-20.0f)

3)projection.perspective:该点永远不会在屏幕上呈现。

有人可以帮我理解这种行为吗?

1 个答案:

答案 0 :(得分:2)

  1. 正射投影以这种方式工作。我建议你搜索一些关于不同投影之间差异的图片或视频。
  2. 我不知道你是如何看到Z坐标中的点平移的,但是如果你有一个正方形,它会通过进一步远离它变得更小(正交它会保持不变)。这里有一个问题,因为你在this value should be positive使用-20.0f代表zNear。在大多数情况下,插入到此方法中的值应使用field of view, aspect ratio生成...无论如何,您将无法看到比zNear更近的任何内容以及zFar以外的任何内容。
  3. 这与视锥体相同,但已将参数视为视野,宽高比。你没有看到任何东西的原因是你的zNear是3.0f,而且距离是.0f。通过翻译这一点,你将能够看到它,但尝试将其翻译为3.0f到7.0f(3.0f是你的zNear,7.0f是你的zFar)。替代方案是增加zFar或向后翻译投影矩阵。或者主要是在你的情况下我建议在投影矩阵上添加一些“look at”系统,因为它会为你提供一些易于使用的工具来操纵你的“相机”,在大多数情况下你可以设置一个你正在看的点,你正在寻找和向上的一点。