zoukankan      html  css  js  c++  java
  • 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;
    }

  • 相关阅读:
    两台linux服务器相互拷贝文件的两个方法
    两台Linux服务器之间复制文件
    Linux两台服务器之间文件/文件夹拷贝
    Linux压缩和解压缩命令
    MongoDB学习笔记 1.1
    centos 7 MysSQL 5.6.39 二进制安装
    CentOS 7 Cobbler 配置 YUM仓库
    CentOS 7 Cobbler 自动化安装系统
    CentOS 7 Cobbler 安装
    OpenStack
  • 原文地址:https://www.cnblogs.com/xiaobo68688/p/2269592.html
Copyright © 2011-2022 走看看