函数原型:

void glViewport(GLintx, GLinty, GLsizeiwidth, GLsizei height)

函数作用:

改变OpengL描绘结果原点在屏幕的位置及尺寸

参数说明:

x 以像素为单位,设置投影结果的原点在屏幕水平方向的位置,屏幕最左端为-width/2(世界坐标系中的-1),右端为width/2(世界坐标的1);

y 以像素为单位,设置投影结果的原点在屏幕垂直方向的位置,屏幕最顶端为height/2(世界坐标系中的1)底端为-height/2(世界坐标系中的-1);

width 屏幕的宽度

height  屏幕的高度

OpenGL默认的屏幕坐标如下:

(-width/2, height/2)                     (width/2, height/2)

(width/2, -height/2)

(-width/2, -height/2)

以上来自于我个人的理解。下面以两个例子作为说明

例一:

代码:

void TriangleWindow::render()

{
    const qreal retinaScale = devicePixelRatio();
    // 设置世界坐标系原点在屏幕的中央
    glViewport(0, 0, width() * retinaScale, height() * retinaScale);
    //glViewport(-width() * retinaScale/2.0f, -height() * retinaScale/2.0f, width() * retinaScale, height() * retinaScale);
    glClear(GL_COLOR_BUFFER_BIT);
    m_program->bind();
    QMatrix4x4 matrix;
    // 单位矩阵
    matrix.setToIdentity();
    // 移动后水平-5000.0f缩放后为世界坐标的-1.0f, 水平5000.0f变为1.0f
    matrix.scale(1/5000.0f, 1.0/2.0f, 0.0f);
    // 移动后水平0.0f变为-5000.0f, 水平10000.0f变为5000.0f
    matrix.translate(-5000.0f,1.0f, 0.0f);
    m_program->setUniformValue(m_matrixUniform, matrix);
    GLfloat  vertices[] = {0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
                          10000.0f, -1.0f,0.0f};
    if(nBegin > 5.0f)
    {
        nBegin = -5.0f;
    }
    GLfloat colors[] = {
        1.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 1.0f
    };
    glVertexAttribPointer(m_posAttr, 3, GL_FLOAT, GL_FALSE, 0, vertices);
    glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, 0, colors);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(0);
    m_program->release();
}

运行结果:

图一

例二:

代码:

void TriangleWindow::render()

{
    const qreal retinaScale = devicePixelRatio();
    // 设置世界坐标系原点在水平最左端,垂直中间
    //glViewport(0, 0, width() * retinaScale, height() * retinaScale);
    glViewport(-width() * retinaScale/2.0f, 0, width() * retinaScale, height() * retinaScale);
    glClear(GL_COLOR_BUFFER_BIT);
    m_program->bind();
    QMatrix4x4 matrix;
    // 单位矩阵
    matrix.setToIdentity();
    // 移动后水平-5000.0f缩放后为世界坐标的-1.0f, 水平5000.0f变为1.0f
    matrix.scale(1/5000.0f, 1.0/2.0f, 0.0f);
    // 移动后水平0.0f变为-5000.0f, 水平10000.0f变为5000.0f
    matrix.translate(-5000.0f,1.0f, 0.0f);
    m_program->setUniformValue(m_matrixUniform, matrix);
    GLfloat  vertices[] = {0.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f,
                          10000.0f, -1.0f,0.0f};
    GLfloat colors[] = {
        1.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 1.0f
    };
    glVertexAttribPointer(m_posAttr, 3, GL_FLOAT, GL_FALSE, 0, vertices);
    glVertexAttribPointer(m_colAttr, 3, GL_FLOAT, GL_FALSE, 0, colors);
    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(0);
    m_program->release();
}

运行结果:

图二

规律:

由于OpenGL水平及垂直方向-1 到1 的结果显示出来,而图二把世界坐标的原点左移屏幕的一半,则图二自然也就是图一显示的一半。

以上是我个人的实践结果。

OpenGL QT glViewport 函数的作用相关推荐

  1. OpenGL之glViewPort函数的用法

    其函数原型为:glViewport(GLint x,GLint y,GLsizei width,GLsizei height) x,y 以像素为单位,指定了视口的左下角位置. width,height ...

  2. OpenGL的glViewPort窗口设置函数实现分屏

    OpenGL的glViewPort窗口设置函数实现分屏 之前实现过全景图片查看(OpenGL的几何变换3之内观察全景图),那么我们需要进行分屏该如何实现呢?如下图: 没错就是以前提过的glViewPo ...

  3. QT 012 [深入] Qt setupUi函数的原理和实现

    1 度娘: setupUi(this)是由.ui文件生成的类的构造函数,这个函数的作用是对界面进行初始化,它按照我们在Qt设计器里设计的样子把窗体画出来,把我们在Qt设计器里面定义的信号和槽建立起来. ...

  4. OpenGL中glRotatef()函数究竟对矩阵做了什么

    OpenGL中glRotatef()函数究竟对矩阵做了什么 我们知道OpenGL中维持着两套矩阵,一个是模型视图矩阵(model view matrix),另一个是投影矩阵(projection ma ...

  5. OpenGL的API函数使用手册

    OpenGL的API函数使用手册 (一)OpenGL函数库 格式: <库前缀><根命令><可选的参数个数><可选的参数类型> 库前缀有 gl.glu.a ...

  6. glViewport()函数和glOrtho()函数的理解

    在OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho. glOrtho是创建一个正交平行的视景体. 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况.比如,常用的工 ...

  7. glViewport()函数和glOrtho()函数的理解(转)

    在OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho. glOrtho是创建一个正交平行的视景体. 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况.比如,常用的工 ...

  8. glViewport函数和glOrtho函数的理解

    在OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho. glOrtho是创建一个正交平行的视景体. 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况.比如,常用的工 ...

  9. Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤

    1.  先按照http://blog.csdn.net/fengbingchun/article/details/10439281中操作搭建好基本的Android开发环境: 2.  打开Eclipse ...

最新文章

  1. 将一个域下的cookie传到另一个域_单点登录那些事儿(二)同域下的单点登录
  2. 字节增强java_提高byte的效率
  3. 编程题【Math类】计算类
  4. android studio开关控件,Android studio实现滑动开关
  5. html代码如何查看视频,Web前端
  6. 自学python买什么教材-从入门到进阶必看,51本Python精品书籍免费送!
  7. Selenium---环境配置
  8. linux中什么是进程名,Linux进程是什么
  9. 7款应用最广泛的Linux桌面环境盘点
  10. 世界杯来了,移动办公的“世界杯”怎么踢?
  11. Catia CAA二次开发视频教程+源代码+PDF教程
  12. 应届生产品助理/经理面试,应当多谈点什么?
  13. Wordpress 网站设计入门 联系表单设计
  14. 时光机之殇---微博告别信
  15. 百度天气预报接口介绍
  16. P1419 寻找段落
  17. 虚拟机安装华为模拟器eNSP过程中所遇问题与解决办法
  18. 联想android模拟器,联想模拟器 v7.3.0 精简版
  19. Office 开发版本号
  20. 红米note5解锁教程_红米Note5解锁bl教程_红米Note5获取解锁码进行一键解锁的方法...

热门文章

  1. MFC 扩展界面 美化
  2. 隔壁老王月月入5W,小王回回考100,这轮回的人生...
  3. Android SDK R17
  4. nginx负载均衡前端项目
  5. 异步编程-Future
  6. Android Studio蓝牙接收字节
  7. IDEA 最新15款插件
  8. 机器学习python库--seaborn
  9. qmx工作室秋季项目作品---2048小游戏
  10. java长整型数输入格式_java编程之计算16位长整型数字中0-9出现次数(从命令窗输入数据)...