当前位置:   article > 正文

OpenGL视口变换函数:glViewport

OpenGL视口变换函数:glViewport

调用glViewPort函数来决定视见区域,告诉OpenGL应把渲染之后的图形绘制在窗体的哪个部位。当视见区域是整个窗体时,OpenGL将把渲染结果绘制到整个窗口。

glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei);

    其中,参数X,Y指定了视见区域的左下角在窗口中的位置,一般情况下为(0,0),Width和Height指定了视见区域的宽度和高度。注意OpenGL使用的窗口坐标和WindowsGDI使用的窗口坐标是不一样的。图3.1-1表示了在WindowsGDI中的窗口坐标,而图3.1-2则是OpenGL所定义的窗口坐标。

 

                                                                                  图3.1-1                                                                                                                                                               图3.1-2

 

    例如,要设置如图3.1-3中的视见区域,我们应该调用函数:

      glViewPort(100,100,Width,Height);

                                                                               图3.1-3

glViewport()函数可以实现拆分窗口的功能,可以用不同的视口多次绘制同一个物体,如,为了创建两个并排的窗口,可以使用下面的这些函数,并辅以适当的模型视图和投影变换:

glViewport(0, 0, sizex/2, sizey);

                      ;

                      ;

                      ;

glViewport(sizex/2, 0,sizex/2, sizey);

 

下面是一个例子:

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

编译运行结果如下:

   


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/589647
推荐阅读
相关标签
  

闽ICP备14008679号