glViewport

来源:互联网 发布:88端口怎么起 编辑:程序博客网 时间:2024/05/17 15:57
glViewport是OpenGL中的一个函数。计算机图形学中,在屏幕上打开窗口的任务是由窗口系统,而不是OpenGL负责的。

1功能编辑

glViewport在默认情况下,视口被设置为占据打开窗口的整个像素矩形,如图1,窗口大小和设置视口大小相同,所以为了选择一个更小的绘图区域,就可以用glViewport函数来实现这一变换,在窗口中定义一个像素矩形,最终将图像映射到这个矩形中。例如可以对窗口区域进行划分,在同一个窗口中显示分割屏幕的效果,以显示多个视图。

2参数编辑

glViewport(GLint x,GLint y,GLsizei width,GLsizei height)为其函数原型。
X,Y————以像素为单位,指定了视口的左下角(在第一象限内,以(0,0)为原点的)位置。
width,height————表示这个视口矩形的宽度和高度,根据窗口的实时变化重绘窗口。

下面是一个例子:

   #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();
}

 

编译运行结果如下:


0 0
原创粉丝点击