您的位置:首页 > 移动开发 > Android开发

Android OpenGL ES和OpenGL一起学(二)------理解Viewport(视口)和坐标系OpenGL篇

2012-03-13 14:46 435 查看
http://www.haogongju.net/art/994038

接下来的代码效果如图:



// 我们定义了一个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的参数,效果如图:



// 我们可以看到,本来在屏幕中央的正方形跑到了左下角
// 因为我们修改了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的参数,效果如图:



我们可以看到,正方形变大了,这是因为我们把坐标系改变了,从以前的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐