Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系OpenGL篇
2012-03-13 14:46
435 查看
http://www.haogongju.net/art/994038
接下来的代码效果如图:
![](http://pic002.cnblogs.com/images/2011/315926/2011113020255677.png)
我们先试着修改一下glViewport的参数,效果如图:
![](http://pic002.cnblogs.com/images/2011/315926/2011113021215139.png)
我们再试着修改一下glOrtho的参数,效果如图:
![](http://pic002.cnblogs.com/images/2011/315926/2011113021260690.png)
我们可以看到,正方形变大了,这是因为我们把坐标系改变了,从以前的left:-100, right:100, bottom:100, top:-100
变成了left:-50, right:50, bottom:50, top:-50,因此我们依然画glRectf(-50.0f, 50.0f, 50.0f, -50.0f);的话,当然是填充的整个视口(Viewport)
接下来的代码效果如图:
![](http://pic002.cnblogs.com/images/2011/315926/2011113020255677.png)
// 我们定义了一个200X200的窗口 // 设置视口为整个窗口 // 横坐标范围为-100到100 // 纵坐标范围为-100到100 // 所以一个left, top, right, bottom为-50.0f, 50.0f, 50.0f, -50.0f的矩形应该在屏幕中间 // 程序运行结果正如预期 #include <GL/gl.h> #include <GL/glut.h> void RenderScene() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.0f, 0.0f); glRectf(-50.0f, 50.0f, 50.0f, -50.0f); glFlush(); } void SetupRC() { glClearColor(0.0f, 0.0f, 1.0f, 1.0f); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // 设置坐标系 // 最左边的横坐标为-100 // 最右边的横坐标为100 // 最下边的纵坐标为100 // 最上边的纵坐标为-100 glOrtho(-100, 100, 100, -100, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } // 回调函数,窗口大小发生变化时调用 void ChangeSize(GLsizei w, GLsizei h) { // 设置视口为整个屏幕 glViewport(0, 0, w, h); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutInitWindowSize(200, 200); // 设置窗口大小为200X200 glutCreateWindow("Simple"); glutDisplayFunc(RenderScene); glutReshapeFunc(ChangeSize); // 当窗口大小发生变化时调用ChangeSize函数 SetupRC(); glutMainLoop(); return 0; }
我们先试着修改一下glViewport的参数,效果如图:
![](http://pic002.cnblogs.com/images/2011/315926/2011113021215139.png)
// 我们可以看到,本来在屏幕中央的正方形跑到了左下角 // 因为我们修改了Viewport,glViewport(0, 0, 100, 100); // 之前是将整个窗口作为视口,现在是让整个窗口的四分之一作为视口 // 程序运行结果和预期相同 #include <GL/gl.h> #include <GL/glut.h> void RenderScene() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.0f, 0.0f); glRectf(-50.0f, 50.0f, 50.0f, -50.0f); glFlush(); } void SetupRC() { glClearColor(0.0f, 0.0f, 1.0f, 1.0f); glMatrixMode(GL_PROJECTION); glLoadIdentity(); // 设置坐标系 // 最左边的横坐标为-100 // 最右边的横坐标为100 // 最下边的纵坐标为100 // 最上边的纵坐标为-100 glOrtho(-100, 100, 100, -100, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } // 回调函数,窗口大小发生变化时调用 void ChangeSize(GLsizei w, GLsizei h) { glViewport(0, 0, 100, 100); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutInitWindowSize(200, 200); // 设置窗口大小为200X200 glutCreateWindow("Simple"); glutDisplayFunc(RenderScene); glutReshapeFunc(ChangeSize); // 当窗口大小发生变化时调用ChangeSize函数 SetupRC(); glutMainLoop(); return 0; }
我们再试着修改一下glOrtho的参数,效果如图:
![](http://pic002.cnblogs.com/images/2011/315926/2011113021260690.png)
我们可以看到,正方形变大了,这是因为我们把坐标系改变了,从以前的left:-100, right:100, bottom:100, top:-100
变成了left:-50, right:50, bottom:50, top:-50,因此我们依然画glRectf(-50.0f, 50.0f, 50.0f, -50.0f);的话,当然是填充的整个视口(Viewport)
#include <GL/gl.h> #include <GL/glut.h> void RenderScene() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0f, 0.0f, 0.0f); glRectf(-50.0f, 50.0f, 50.0f, -50.0f); glFlush(); } void SetupRC() { glClearColor(0.0f, 0.0f, 1.0f, 1.0f); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50, 50, 50, -50, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } // 回调函数,窗口大小发生变化时调用 void ChangeSize(GLsizei w, GLsizei h) { glViewport(0, 0, 100, 100); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutInitWindowSize(200, 200); // 设置窗口大小为200X200 glutCreateWindow("Simple"); glutDisplayFunc(RenderScene); glutReshapeFunc(ChangeSize); // 当窗口大小发生变化时调用ChangeSize函数 SetupRC(); glutMainLoop(); return 0; }
相关文章推荐
- Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系OpenGL篇
- Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系Android OpenGL ES篇
- Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系Android OpenGL ES篇(转帖)
- Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系Android OpenGL ES篇
- Android OpenGL ES和OpenGL一起学(一)------绘制一个简单的矩形
- Android OpenGL ES和OpenGL一起学(一)------绘制一个简单的矩形
- Android OpenGL ES零基础系列(二):OpenGL坐标系的深入理解
- Android OpenGL ES和OpenGL一起学(三)——练习:一个不会改变形状的正方形
- Android OpenGL ES和OpenGL一起学(三)——练习:一个不会改变形状的正方形
- Android OpenGL ES 开发教程(7):创建实例应用OpenGLDemos程序框架
- 使用Android OpenGL ES 2.0绘图之四:应用投影和相机视口
- [android] OpenGL与OpenGL ES简介
- Android OpenGL ES零基础系列(一):理解GLSurfaceView,GLSurfaceView.Render的基本用法
- Android OpenGL ES(六)创建实例应用OpenGLDemos程序框架 .
- 使用Android OpenGL ES 2.0绘图之四:应用投影和相机视口
- Android OpenGL ES 开发教程(7):创建实例应用OpenGLDemos程序框架
- android之OpenGL、OpenGL ES初步
- Android之OpenGL里FBO理解测试实例
- Android OpenGL ES 开发教程(25):OpenGL光照模型
- 移动端布局:视口viewport的理解