zoukankan      html  css  js  c++  java
  • OpenGL新手框架

    开始学习用OpenGL,也就想显示一些点,以为挺简单的,哎,看了两天才会画三维的点,做个总结。

    使用OpenGL的基本流程

    int main(int argv, char *argc[])
    {
        //初始化glut
        glutInit(&argv, argc);
        //初始化显示模式
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
        //设置窗口大小
        glutInitWindowSize(800, 600);
        //创建窗口
        glutCreateWindow("Point Demo");
    
        //注册回调函数
        glutReshapeFunc(onChangeSize);
        glutDisplayFunc(onRender);
        glutSpecialFunc(onSpecialKeyFunc);
    
        setupRenderingContext();
    
        glutMainLoop();
    
        return 0;
    }

    主要是glut库进行了一些初始化操作,并注册需要的回调函数(事件处理函数)。

    glutReshapeFunc  窗口大小发生改变的时候调用注册函数

    glutDisplayFunc   显示的时候调用的函数,各种的画图操作都在这里进行

    glutSpecialFunc   特殊按键(上、下、左、右)按下时调用的函数

    还有其他的一些回调函数,例如:窗口关闭时,这里不再一一赘述。

    setupRenderingContext 设置渲染的上下文(渲染环境)

    glutMainLoop  进入主消息循环

    函数名称的一个简单说明glut开头的是glut库的一些函数,gl开头的则是标准的OpenGL库的函数。由于OpenGL没有提供诸如窗口管理、输入输出以及按键等的处理函数,所以需要一些OpenGL的扩展库

    来处理这些操作,并且OpenGL官方也提倡开发一些扩展库。glut是OpenGL中比较常见的一种。

    回调函数及渲染环境设置

    窗口大小改变时的回调函数

    //窗口大小改变的回调函数
    void onChangeSize(GLint w,GLint h){
        //横宽比
        GLfloat ratio;
    
        //设置坐标系x(-100.0f,100.0f),y(-100.0f,100.0f),z(-100.0f,100.0f)
        GLfloat coordinateSize = 100.0f;
    
        //设置视口和窗口大小一样
        glViewport(0, 0, w, h);
    
        //对投影矩阵应用随后的矩阵操作
        glMatrixMode(GL_PROJECTION);
    
        //重置当前指定的矩阵为单位矩阵
        glLoadIdentity();
        ratio = (GLfloat)w / (GLfloat)h;
    
        //正交投影
        if (w < h)
            glOrtho(-coordinateSize, coordinateSize, -coordinateSize / ratio, coordinateSize / ratio, -coordinateSize, coordinateSize);
        else
            glOrtho(-coordinateSize * ratio, coordinateSize * ratio, -coordinateSize, coordinateSize, -coordinateSize, coordinateSize);
    
        //对模型视图矩阵堆栈应用随后的矩阵操作
        glMatrixMode(GL_MODELVIEW);
        //重置当前指定矩阵为单位矩阵
        glLoadIdentity();
    }

    设置所使用的坐标系以及视口(viewport),坐标系、视口以及一些矩阵变换另作总结,这里不详述。

    Display时的回调函数

    //渲染
    void onRender(){
        //清理
        glClear(GL_COLOR_BUFFER_BIT);
    
        //将当前matrix状态入栈
        glPushMatrix();
        
        glRotatef(xRotAngle, 1.0f, 0.0f, 0.0f);
        glRotatef(yRotAngle, 0.0f, 1.0f, 0.0f);
    
        glBegin(GL_POINTS);
        srand((unsigned)time(NULL));
        GLfloat x, y, z;
        for (int i = 0; i < 1000; i ++){
            x = rand() % 201 - 100;
            y = rand() % 201 - 100;
            z = rand() % 201 - 100;
    
            glVertex3f(x, y, z);
        }
        glEnd();
        //恢复栈的Matrix
        glPopMatrix();
    
        //交换两个缓冲区
        glutSwapBuffers();
    }

    生成1000个随机的三维点,作图的操作主要这里进行。

    设置渲染环境

    //设置Rendering context
    void setupRenderingContext() {
        //设置clear color为黑色
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    
        //设置绘图颜色
        glColor3f(1.0f, 1.0f, 0.0f);
    }

    设置了背景色以及绘图的前景色

    特殊按键回调函数

    void onSpecialKeyFunc(GLint key, GLint x, GLint y){
        if (key == GLUT_KEY_UP){
            xRotAngle -= 5.0f;
        }
        else if (key == GLUT_KEY_DOWN){
            xRotAngle += 5.0f;
        }
        else if (key == GLUT_KEY_LEFT){
            yRotAngle -= 5.0f;
        }
        else if (key == GLUT_KEY_RIGHT){
            yRotAngle += 5.0f;
        }
        //重新绘制
        glutPostRedisplay();
    }

    按下上、下、左、右键时进行旋转

    结果

    image

     

    总结

    简单的OpenGL使用框架

    //设置Rendering context
    void setupRenderingContext() {
        //设置clear color为黑色
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    
        //设置绘图颜色
        glColor3f(1.0f, 1.0f, 0.0f);
    }
    
    //窗口大小改变的回调函数
    void onChangeSize(GLint w,GLint h){
        //横宽比
        GLfloat ratio;
    
        //设置坐标系x(-100.0f,100.0f),y(-100.0f,100.0f),z(-100.0f,100.0f)
        GLfloat coordinateSize = 100.0f;
    
        //设置视口和窗口大小一样
        glViewport(0, 0, w, h);
    
        //对投影矩阵应用随后的矩阵操作
        glMatrixMode(GL_PROJECTION);
    
        //重置当前指定的矩阵为单位矩阵
        glLoadIdentity();
        ratio = (GLfloat)w / (GLfloat)h;
    
        //正交投影
        if (w < h)
            glOrtho(-coordinateSize, coordinateSize, -coordinateSize / ratio, coordinateSize / ratio, -coordinateSize, coordinateSize);
        else
            glOrtho(-coordinateSize * ratio, coordinateSize * ratio, -coordinateSize, coordinateSize, -coordinateSize, coordinateSize);
    
        //对模型视图矩阵堆栈应用随后的矩阵操作
        glMatrixMode(GL_MODELVIEW);
        //重置当前指定矩阵为单位矩阵
        glLoadIdentity();
    }
    
    //渲染
    void onRender(){
        //清理
        glClear(GL_COLOR_BUFFER_BIT);
    
        //TODO:主要操作在这里
    
        //交换两个缓冲区
        glutSwapBuffers();
    }
    
    int main(int argv, char *argc[])
    {
        //初始化glut
        glutInit(&argv, argc);
        //初始化显示模式
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
        //设置窗口大小
        glutInitWindowSize(800, 600);
        //创建窗口
        glutCreateWindow("Point Demo");
    
        //注册回调函数
        glutReshapeFunc(onChangeSize);
        glutDisplayFunc(onRender);
    
        setupRenderingContext();
    
        glutMainLoop();
    
        return 0;
    }

     

  • 相关阅读:
    zabbix 监控获取源码包的地址
    为MongoDB加集群验证的关键点
    Mongodb 集群加keyFile认证
    Prometheus完整的部署方案+实战实例
    如何让你的linux的命令行变得很炫
    redis实现加锁的几种方法示例详解
    phpquerylist 抓取数据详解
    mysql 主从配置,主-》windows,从-》centos6.5
    VMware 虚拟机centos下链接网络配置
    【Mysql】表链接
  • 原文地址:https://www.cnblogs.com/wangguchangqing/p/4433322.html
Copyright © 2011-2022 走看看