Opengl es OpenGL正交、透视和平截头体投影

Opengl es OpenGL正交、透视和平截头体投影,opengl-es,qglwidget,Opengl Es,Qglwidget,45我试图理解OpenGL在单点上的投影。我使用QGLWidget渲染上下文,使用QMatrix4x4渲染投影矩阵。这里是draw函数 attribute vec4 vPosition; uniform mat4 projection; uniform mat4 modelView; void main() { gl_Position = projection* vPosition;

45我试图理解OpenGL在单点上的投影。我使用QGLWidget渲染上下文,使用QMatrix4x4渲染投影矩阵。这里是draw函数

    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);            
        }
属性向量4位置;
均匀mat4投影;
统一mat4模型视图;
void main()
{
gl_位置=投影*位置;
}       
void OpenGLView::Draw()
{
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glUseProgram(programObject);
glViewport(0,0,width(),height());
qreal方面=(qreal)800/((qreal)600);
常数qreal zNear=3.0f,zFar=7.0f,fov=45.0f;
QMatrix4x4投影;
projection.setToIdentity();
投影正交(-1.0f,1.0f,-1.0f,1.0f,-20.0f,20.0f);
//平截头体(-1.0f,1.0f,-1.0f,1.0f,-20.0f,20.0f);
//投影。透视图(视野、纵横比、zNear、zFar);
position.setToIdentity();
位置。平移(0.0f,0.0f,-5.0f);
位置。旋转(0,0,0,0);
QMatrix4x4 MVP矩阵=投影*位置;
对于(int r=0;r
  • 正交投影就是这样工作的。我建议你搜索一些关于不同投影之间差异的图像或视频
  • 我不知道你怎么看Z坐标中的点平移,但如果你有一个正方形,它会随着平移距离的增加而变小(使用正交,它会保持不变)。这里有一个问题,因为您在使用-20.0f表示zNear时。在大多数情况下,插入到此方法中的值应使用…生成。无论如何,您将无法看到比zNear更近的任何内容,也无法看到比zFar更远的任何内容
  • 这与平截头体相同,但已将参数作为视场、纵横比。你看不到任何东西的原因是你的zNear位于3.0f,而点的长度为.0f。通过平移点,你将能够看到它,但尝试将其平移到3.0f到7.0f(3.0f是你的zNear,7.0f是你的zFar)。替代方法是增加zFar或向后转换投影矩阵。或者,在您的情况下,我建议在投影矩阵上添加一些“注视”系统,因为它将为您提供一些易于使用的工具来操作“相机”。在大多数情况下,您可以设置您注视的点、正在注视的点和上方向向量