zoukankan      html  css  js  c++  java
  • 《OpenGL超级宝典第5版》学习笔记(一)—— 第一个OpenGL程序

    // GLTools库包含了一个用于操作矩阵和向量的3D数学库,并依靠GLEW获得OpenGL3.3中用来产生和渲染一些简单3D对象的函数,
    // 以及对视觉平截头体、相机类和变换矩阵进行管理的函数的充分支持。
    #include <GLTools.h>
    
    // GLShaderManager为GLTools的着色器管理器类。没有着色器,我们就不能再OpenGL(核心架构)中进行着色。着色器管理器类不仅允许我们创建并管理着色器,
    // 还提供一组“存储着色器”(Stock Shader),它们能够进行一些初步和基本的渲染操作。
    #include <GLShaderManager.h>
    
    // 判断程序是在Mac上还是在Windows上建立,并选择对应的函数库。
    #ifdef _APPLE_
    #include <glut/glut.h>
    #else
    #define FREEGLUT_STATIC
    #include <GL/glut.h>
    #endif
    
    GLBatch trangleBatch;
    GLShaderManager shaderManager;
    
    
    
    void ChangeSize(int w, int h)
    {
        // 设置视口大小。
        glViewport(0, 0, w, h);
    }
    
    void SetupRc()
    {
        // 用当前颜色清除窗口
        glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
    
        // 初始化着色器
        shaderManager.InitializeStockShaders();
    
        // 在笛卡尔坐标系中指定三角形三个顶点的坐标。
        GLfloat vVerts[] = { -0.5f, 0.0f, 0.0f,
                              0.5f, 0.0f, 0.0f,
                              0.0f, 0.5f, 0.0f, };
    
        // 建立三角形的批次。
        trangleBatch.Begin(GL_TRIANGLES, 3);
        trangleBatch.CopyVertexData3f(vVerts);
        trangleBatch.End();
    }
    
    void RenderScene(void)
    {
        // 清除缓冲区(颜色缓冲区、深度缓冲区、模板缓冲区)。
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    
        // 指定三角形的颜色为红色。
        GLfloat vRed[] = { 1.0f, 0.0f, 0.0f, 1.0f };
    
        // 将颜色传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标系在屏幕上渲染几何图形。
        shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
    
        // 指示将几何图形提交到着色器。
        trangleBatch.Draw();
    
        // 启用双缓冲进行绘制。
        glutSwapBuffers();
    
    }
    
    int main(int argc, char* argv[])
    {
        // 设置当前工作目录,在Windows中并不是必要的。
        gltSetWorkingDirectory(argv[0]);
    
        // 初始化GLUT库。
        glutInit(&argc, argv);
    
        // 在创建窗口时使用下列类型的显示模式:使用双缓冲窗口、RGBA颜色模式、启用深度测试以及模板测试。
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    
        // 设置窗口大小。
        glutInitWindowSize(800, 600);
    
        //  创建一个以“Triangle”为标题的窗口。
        glutCreateWindow("Triangle");
    
        // 窗口大小改变的回调函数。
        glutReshapeFunc(ChangeSize);
    
        // 窗口重绘的回调函数。
        glutDisplayFunc(RenderScene);
    
        // 重新调用GLEW库初始化OpenGL驱动程序中所有丢失的入口点,以确保OpenGL API对我们来说完全可用。
        GLenum err = glewInit();
        if (GLEW_OK != err)
        {
            fprintf(stderr, "GLEW Error: %s
    ", glewGetErrorString(err));
            return -1;
        }
    
        // 创建并初始化渲染环境。
        SetupRc();
    
        // 启用主循环。
        glutMainLoop();
    
        return 0 ;
        
    }
    View Code

    程序运行结果:

  • 相关阅读:
    lombok 下的@Builder注解用法
    吉特日化MES实施--三种浪费
    吉特日化MES配料工艺参数标准版-第二版
    吉特日化MES系统&生产工艺控制参数对照表
    吉特日化MES & SQL Server 无法执行数据库脚本
    吉特日化MES系统--通过浏览器调用标签打印
    吉特日化MES&WMS系统--三色灯控制协议转http
    吉特仓储管理系统-库存管理分类汇总
    “千言数据集:文本相似度”权威评测,网易易智荣登榜首
    网易有数品牌升级:聚焦数据价值,助力企业数字化创新
  • 原文地址:https://www.cnblogs.com/ppffs/p/3230213.html
Copyright © 2011-2022 走看看