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


    接下来的代码效果如图:

    // 我们定义了一个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;
    }

  • 相关阅读:
    java解析php函数json_encode unicode 编码问题
    python根据域名循环遍历查找绑定IP
    android开发 sqlite设置本地时间
    android判断指定软件是否安装
    android中安装,启动和卸载应用
    .net程序员面试题
    error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
    jQuery EasyUI学习笔记
    [转载]NetBox使用教程!
    Sql一次清空所有数据(基于 Mgo Bcp)
  • 原文地址:https://www.cnblogs.com/xiaobo68688/p/2269592.html
Copyright © 2020-2023  润新知