OpenGL QT glViewport 函数的作用
函数原型:
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 函数的作用相关推荐
- OpenGL之glViewPort函数的用法
其函数原型为:glViewport(GLint x,GLint y,GLsizei width,GLsizei height) x,y 以像素为单位,指定了视口的左下角位置. width,height ...
- OpenGL的glViewPort窗口设置函数实现分屏
OpenGL的glViewPort窗口设置函数实现分屏 之前实现过全景图片查看(OpenGL的几何变换3之内观察全景图),那么我们需要进行分屏该如何实现呢?如下图: 没错就是以前提过的glViewPo ...
- QT 012 [深入] Qt setupUi函数的原理和实现
1 度娘: setupUi(this)是由.ui文件生成的类的构造函数,这个函数的作用是对界面进行初始化,它按照我们在Qt设计器里设计的样子把窗体画出来,把我们在Qt设计器里面定义的信号和槽建立起来. ...
- OpenGL中glRotatef()函数究竟对矩阵做了什么
OpenGL中glRotatef()函数究竟对矩阵做了什么 我们知道OpenGL中维持着两套矩阵,一个是模型视图矩阵(model view matrix),另一个是投影矩阵(projection ma ...
- OpenGL的API函数使用手册
OpenGL的API函数使用手册 (一)OpenGL函数库 格式: <库前缀><根命令><可选的参数个数><可选的参数类型> 库前缀有 gl.glu.a ...
- glViewport()函数和glOrtho()函数的理解
在OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho. glOrtho是创建一个正交平行的视景体. 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况.比如,常用的工 ...
- glViewport()函数和glOrtho()函数的理解(转)
在OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho. glOrtho是创建一个正交平行的视景体. 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况.比如,常用的工 ...
- glViewport函数和glOrtho函数的理解
在OpenGL中有两个比较重要的投影变换函数,glViewport和glOrtho. glOrtho是创建一个正交平行的视景体. 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况.比如,常用的工 ...
- Eclipse中通过Android模拟器调用OpenGL ES2.0函数操作步骤
1. 先按照http://blog.csdn.net/fengbingchun/article/details/10439281中操作搭建好基本的Android开发环境: 2. 打开Eclipse ...
最新文章
- 将一个域下的cookie传到另一个域_单点登录那些事儿(二)同域下的单点登录
- 字节增强java_提高byte的效率
- 编程题【Math类】计算类
- android studio开关控件,Android studio实现滑动开关
- html代码如何查看视频,Web前端
- 自学python买什么教材-从入门到进阶必看,51本Python精品书籍免费送!
- Selenium---环境配置
- linux中什么是进程名,Linux进程是什么
- 7款应用最广泛的Linux桌面环境盘点
- 世界杯来了,移动办公的“世界杯”怎么踢?
- Catia CAA二次开发视频教程+源代码+PDF教程
- 应届生产品助理/经理面试,应当多谈点什么?
- Wordpress 网站设计入门 联系表单设计
- 时光机之殇---微博告别信
- 百度天气预报接口介绍
- P1419 寻找段落
- 虚拟机安装华为模拟器eNSP过程中所遇问题与解决办法
- 联想android模拟器,联想模拟器 v7.3.0 精简版
- Office 开发版本号
- 红米note5解锁教程_红米Note5解锁bl教程_红米Note5获取解锁码进行一键解锁的方法...