Chinaunix首页 | 论坛 | 博客
  • 博客访问: 761192
  • 博文数量: 111
  • 博客积分: 3895
  • 博客等级: 中校
  • 技术积分: 1300
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-29 21:26
文章分类

全部博文(111)

文章存档

2014年(22)

2013年(8)

2010年(14)

2009年(21)

2008年(46)

我的朋友

分类: LINUX

2009-03-05 17:20:20

从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。
阅读(2745) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-03-05 17:29:23

#pragma预处理指令是“提供额外信息给编译器”的标准方法。此预处理指令具有下面的格式: #pragma [tokens] 如果#pragma之后的第一个token是STDC,那么此预处理指令就是一个标准的pragma;如果不是的话,那么此#pragma预处理指令的作用,就会因为实现版本不同而不同。为了不降低代码的可移植性,应该尽量少使用#pragma预处理指令。 如果预处理器找到支持的token,就会执行这些token所代表的动作,或者把这个信息传递给编译器。如果预处理器不支持这些token,就必须忽略这个#pragma预处理指令。