首页
登录 | 注册

OpenGL多视口变换函数:glViewport使用

OpenGL多视口变换函数:glViewport使用


glViewport是OpenGL中的一个函数。计算机图形学中,在屏幕上打开窗口的任务是由窗口系统,而不是OpenGL负责的


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

2.参数

视口的左下角(在第一象限内,以(0,0)为原点的)位置。width,height————表示这个视口矩形的宽度和高度,根据窗口的实时变化重绘窗口。

3.代码示例:
//计算gluLookAt矩阵  
#pragma once
#include <windows.h>
#define GLUT_DISABLE_ATEXIT_HACK
#include <gl/glut.h>
#include <atlimage.h>
#include <math.h>
//不显示控制台窗口  
//#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  

float g_RotAngle = 0.5;

void TimerFunction(int value)
{
	g_RotAngle += 1.0;
	if (g_RotAngle>=360)
	{
		g_RotAngle = 0;
	}
	glutPostRedisplay();
	glutTimerFunc(10, TimerFunction, 1);
}
void display()
{
	//glMatrixMode( GL_MODELVIEW );
	//glLoadIdentity();
	glClear(GL_COLOR_BUFFER_BIT);
	glColor3f(1.0, 0.0, 0.0);
	//画分割线,分成四个视见区
	glViewport(0, 0, 800, 600);
	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, 400, 300);
	glPushMatrix();
	glRotatef(g_RotAngle, 0.0, 1.0, 0.0);
	glBegin(GL_POLYGON);
	glVertex2f(-0.5, -0.5);
	glVertex2f(-0.5, 0.5);
	glVertex2f(0.5, 0.5);
	glVertex2f(0.5, -0.5);
	glEnd();
	glPopMatrix();

	//定义在右上角的区域
	glColor3f(0.0, 0.0, 1.0);
	glViewport(400, 300, 400, 300);//一定要注意,后面这两个参数是高度和宽度,而不是坐标
	glPushMatrix();
	glRotatef(-g_RotAngle, 0.0, 1.0, 0.0);
	glBegin(GL_POLYGON);
	glVertex2f(-0.5, -0.5);
	glVertex2f(-0.5, 0.5);
	glVertex2f(0.5, 0.5);
	glVertex2f(0.5, -0.5);
	glEnd();
	glPopMatrix();
	//定义在左上角的区域
	glColor3f(1.0, 0.0, 1.0);
	glViewport(0, 300, 400, 300);//一定要注意,后面这两个参数是高度和宽度,而不是坐标
	glPushMatrix();
	glRotatef(-2*g_RotAngle, 0.0, 1.0, 0.0);
	glBegin(GL_POLYGON);
	glVertex2f(-0.5, -0.5);
	glVertex2f(-0.5, 0.5);
	glVertex2f(0.5, 0.5);
	glVertex2f(0.5, -0.5);
	glEnd();
	glPopMatrix();
	//定义在右下角
	glColor3f(1.0, 1.0, 0.0);
	glViewport(400, 0, 400,300);//一定要注意,后面这两个参数是高度和宽度,而不是坐标
	glPushMatrix();
	glRotatef(-3*g_RotAngle, 0.0, 1.0, 0.0);
	glBegin(GL_POLYGON);
	glVertex2f(-0.5, -0.5);
	glVertex2f(-0.5, 0.5);
	glVertex2f(0.5, 0.5);
	glVertex2f(0.5, -0.5);
	glEnd();
	glPopMatrix();
	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(800, 600);
	glutCreateWindow("OpenGL多视口编程");
	glutDisplayFunc(display);
	init();
	glutTimerFunc(1, TimerFunction, 1);
	glutMainLoop();
}
4.截图效果:
OpenGL多视口变换函数:glViewport使用



2020 jeepxie.net webmaster#jeepxie.net
10 q. 0.008 s.
京ICP备10005923号