glViewport()和gluOtho2d()的用法

来源:互联网 发布:java把数据发到syslog 编辑:程序博客网 时间:2024/06/07 09:13

转自:http://blog.sina.com.cn/s/blog_6ca732110100mvrt.html


 一、gluOtho2d()
        这个函数是定义剪裁面,何谓剪裁面,我这样理解,我们是在一个无限的空间里绘图,因为坐标是 可以随便指定的,随便在哪个坐标绘图,但是我们可以通过定一个剪裁面,也就是说,有一架照相机,尽管沿途风景很多,但是镜头只能拍到一定的范围,这个范围就是我们的剪裁面,我们能显示的就是这个剪裁面。
     二、glViewPort()
        这个函数跟上面的相似,但是我们发现上面的指定一个剪裁面后,是在我们定义的窗口的整个窗口中显示我们剪裁出来的面,而这个函数就是为了在一部分中显我们要显示的剪裁面,即,我们先取景(就是用gluOrtho2D()剪出来那个),然后在我们定义的窗口中选一个区域来显示这个取好的景。
     下面是一个例子:
   #include <gl/glut.h>
//不显示控制台窗口
#pragma comment( linker, "/subsystem:"windows" /entry:"mainCRTStartup"")
void display()
{
//glMatrixMode( GL_MODELVIEW );
//glLoadIdentity();
    glClear( GL_COLOR_BUFFER_BIT );
glColor3f( 1.0, 0.0, 0.0 );
//画分割线,分成四个视见区
glViewport( 0, 0, 400, 400 );
glBegin( GL_LINES );
     glVertex2f( -1.0, 0 );
   glVertex2f( 1.0, 0 );
   glVertex2f( 0.0, -1.0 );
   glVertex2f( 0.0, 1.0 );
    glEnd();
//定义在左下角的区域
glColor3f( 0.0, 1.0, 0.0 );
glViewport( 0, 0, 200, 200 );
glBegin( GL_POLYGON );
   glVertex2f( -0.5, -0.5 );
     glVertex2f( -0.5, 0.5 );
   glVertex2f( 0.5, 0.5 );
   glVertex2f( 0.5, -0.5 );
glEnd();


//定义在右上角的区域
glColor3f( 0.0, 0.0, 1.0 );
glViewport( 200, 200, 200, 200 );//一定要注意,后面这两个参数是高度和宽度,而不是坐标
    glBegin( GL_POLYGON );
     glVertex2f( -0.5, -0.5 );
     glVertex2f( -0.5, 0.5 );
     glVertex2f( 0.5, 0.5 );
     glVertex2f( 0.5, -0.5 );
glEnd();
//定义在左上角的区域
glColor3f( 1.0, 0.0, 1.0 );
glViewport( 0, 200, 200, 200 );//一定要注意,后面这两个参数是高度和宽度,而不是坐标
glBegin( GL_POLYGON );
glVertex2f( -0.5, -0.5 );
glVertex2f( -0.5, 0.5 );
glVertex2f( 0.5, 0.5 );
glVertex2f( 0.5, -0.5 );
glEnd();
//定义在右下角
glColor3f( 1.0, 1.0, 0.0 );
glViewport( 200, 0, 200, 200 );//一定要注意,后面这两个参数是高度和宽度,而不是坐标
glBegin( GL_POLYGON );
glVertex2f( -0.5, -0.5 );
glVertex2f( -0.5, 0.5 );
glVertex2f( 0.5, 0.5 );
glVertex2f( 0.5, -0.5 );
glEnd();
glFlush();
}
void init()
{
    glClearColor( 0.0, 0.0, 0.0, 0.0 );
glColor3f( 1.0, 1.0, 1.0 );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
//定义剪裁面
gluOrtho2D( -1.0, 1.0, -1.0, 1.0 );
//glViewport( 0, 0, 200, 200 ); //放在这里不好使
}
int main( int argc, char ** argv )
{
     glutInit( &argc, argv );
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
glutInitWindowPosition( 100, 100 );
glutInitWindowSize( 400, 400 );
glutCreateWindow( "glViewport()" );
glutDisplayFunc( display );
     init();
glutMainLoop();
}
 

原创粉丝点击