从2月末(大概)开始接触OpenGL,对里面的几个变换:视点变换(Viewing Transformation)、模型变换(Modeling Transformation)、投影变换(Projection Transformation)、视口变换(Viewport Transformation)还是没有深入的理解,这妨碍了三维场景的制作及其他知识的进一步学习。下午又看了变换,找到一个例子,对glViewport有了清晰的认识,如下:
#include
//不显示控制台窗口
#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();
return 0;
}
GLUT库中几个函数的解释:
·glutInit用来初始化GLUT库并同窗口系统对话协商。
·glutInitDisplayMode用来确定所创建窗口的显示模式。本例中的参数GLUT_SINGLE 指定单缓存窗口,这也是缺省模式,对应的模式为GLUT_DOUBLE 双缓存窗口。参数GLUT_RGB指定颜色RGBA模式,这也是缺省模式,对应的模式为GLUT_INDEX 颜色索引模式窗口。
·glutInitWindowSize 初始化窗口的大小,第一个参数为窗口的宽度,第二个参数为窗口的高度,以像素为单位。
·glutInitWindowPosition 设置初始窗口的位置,第一个参数为窗口左上角x的坐标,第二个参数为窗口左上角y的坐标,以像素为单位。屏幕的左上角的坐标为(0,0),横坐标向右逐渐增加,纵坐标向下逐渐增加。
·glutCreateWindow 创建顶层窗口,窗口的名字为扩号中的参数。
·glutReshapeFunc 注册当前窗口的形状变化回调函数。当改变窗口大小时,该窗口的形状改变回调函数将被调用。在此例中就是myReshape指定形状变化函数。
·glutDisplayFunc 注册当前窗口的显示回调函数。当一个窗口的图像层需要重新绘制时,GLUT将调用该窗口的的显示回调函数。在此例中的mydisplay就是显示回调函数,显示回调函数不带任何参数,它负责整个图像层的绘制。我们的大部分工作将集中在这个函数中。
·glutMainLoop 进入GLUT事件处理循环。glutMainLoop函数在GLUT程序中最多只能调用一次,它一旦被调用就不再返回,并且调用注册过的回调函数。所以这个函数必须放在注册回调函数的后面,比如glutReshapeFunc, glutDisplayFunc。
阅读(2811) | 评论(1) | 转发(0) |