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-3中的视见区域,我们应该调用函数:

      glViewPort(100,100,Width,Height);

                                                                               图3.1-3

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

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

                      ;

                      ;

                      ;

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

 

理解glViewport和 gluOrtho2D的好例子:


#include <gl/glut.h>

//不显示控制台窗口
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

void display()
{
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, 0.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, 1.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 );
}

int main( int argc, char ** argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
glutInitWindowPosition( 100, 100 );
glutInitWindowSize( 400, 400 );
glutCreateWindow( "蒋昌松_使用glbegin_glend_glViewport" );
glutDisplayFunc( display );
init();
glutMainLoop();
}






  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenGl坐标变换是指将一个坐标系中的点转换到另一个坐标系中的点的过程。在OpenGL中,常见的坐标系包括模型坐标系、世界坐标系、视坐标系和裁剪坐标系。坐标变换可以通过矩阵变换来实现,OpenGL提供了一些函数来进行矩阵变换,例如glTranslate、glRotate和glScale等函数。 下面是一个简单的例子,演示了如何使用OpenGL进行坐标变换: ```python import glfw from OpenGL.GL import * from OpenGL.GLU import * def main(): # 初始化glfw if not glfw.init(): return # 创建窗口 window = glfw.create_window(640, 480, "OpenGL Window", None, None) if not window: glfw.terminate() return # 设置窗口为当前上下文 glfw.make_context_current(window) # 设置视口 glViewport(0, 0, 640, 480) # 设置投影矩阵 glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(45, 640/480, 0.1, 100) # 设置模型视图矩阵 glMatrixMode(GL_MODELVIEW) glLoadIdentity() # 绘制三角形 glBegin(GL_TRIANGLES) glVertex3f(-1, -1, -5) glVertex3f(1, -1, -5) glVertex3f(0, 1, -5) glEnd() # 平移变换 glTranslatef(0, 0, -5) # 旋转变换 glRotatef(45, 0, 1, 0) # 缩放变换 glScalef(2, 2, 2) # 绘制三角形 glBegin(GL_TRIANGLES) glVertex3f(-1, -1, 0) glVertex3f(1, -1, 0) glVertex3f(0, 1, 0) glEnd() # 交换缓冲区 glfw.swap_buffers(window) # 循环渲染,直到窗口关闭 while not glfw.window_should_close(window): glfw.poll_events() # 终止glfw glfw.terminate() if __name__ == '__main__': main() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值