注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

hhfighting的博客

以责人之心责己,以恕己之心恕人

 
 
 

日志

 
 
 
 

glViewport和glOrtho理解  

2010-11-18 22:40:19|  分类: 专业知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
glViewPort是用来设置视口大小的,一般就是显示窗口的大小。
glOrtho是创建一个正交平行的视景体,即用来确定场景的哪部分显示在屏幕上。
一般情况下,要保证视口的长宽比和视景体的长宽比一致,否侧的话,会出现图像变形。
为什么会变形呢?这里拿一个例子来说明一下吧。
比如:如果我们使用glut库建立一个窗体:glutInitWindowSize(500, 500); 然后使用glutReshapeFunc(reshape); reshape代码如下:
void reshape(int width, int height)
{

    glViewport(0, 0, (GLsizei)width, (GLsizei)height);
    glMatrixModel(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);

    ....
}

显示效果如下:

glViewport和glOrtho理解 - hhfighting - hhfighting的博客

假设在窗口区域我们显示的是一个球体,那此时球体是正常的(。如果我们定义的窗体大小发生了变化,即glutInitWindowSize(800, 500),那么显示的效果会变成什么样的呢?让我们来看一下效果吧(变成扁的( ⊙ o ⊙ )啊!)。

glViewport和glOrtho理解 - hhfighting - hhfighting的博客  

为什么会这样呢?

初始情况:glViewport(0, 0, 500, 500);  glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10); 这时,视景体和视口比例是一致的,所以显示是正常的。

改变后:glViewport(0, 0, 800, 500);  glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10); 还是用一个方形视景体去截取场景,但投影到屏幕上时,横向拉伸的比纵向拉伸的多,因此效果就变成那样了。

那平时在写程序的时候,我们应该怎么防止上述情况出现呢?方法就是要保证视景体的长宽比和视口长宽比一致。

下面给出两种解决方案。

一是:视景体不变,把视口比例调成和视景体一致。

具体实现为:

void reshape(int width, int height)
{
    int dis = width < height ? width : height;
    glViewport(0, 0, dis, dis);   /*这里dis应该是500*/

    glMatrixModel(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.5, 1.5, -1.5, 1.5, -10, 10);
    .....
}

glViewport和glOrtho理解 - hhfighting - hhfighting的博客

从显示效果,我们可以看出,我们只使用了窗口的一部分,窗口没有得到合理利用。

二是:视口扔按照窗口大小进行设置,修改视景体大小来保持一致。

void reshape(int width , int height)

{
    glViewport(width, height); 
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if (width <= height)
        glOrtho(-1.5, 1.5, -1.5 * (GLfloat)height/(GLfloat)width, 1.5 * (GLfloat)height/(GLfloat)width, -10.0, 10.0);
    else
        glOrtho(-1.5*(GLfloat)width/(GLfloat)height, 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);

    ....
}

glViewport和glOrtho理解 - hhfighting - hhfighting的博客

改变视景体大小的话,也会存在一些问题,为了保证球体完全显示,势必会把不需要的东西也包含在视景体内(这里是球形横向周围的黑色区域),在一个复杂的场景中,包含了不必要的物体进来,会影响绘制速率。

上述两种方法,各有利弊具体选用哪个,要根据自己的实际需要奥。

  评论这张
 
阅读(935)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018