美文网首页
03源码--001--OpenGL 环境搭建

03源码--001--OpenGL 环境搭建

作者: 修_远 | 来源:发表于2020-07-02 09:09 被阅读0次

    [TOC]

    一、准备条件

    • Mac设备一台(iOS开发者必备)
    • glew
    • GLTools
    • libGLTools.a

    蓝宝书Github

    GLTools文件

    二、配置 OpenGL 环境(项目设置)

    1. 创建一个 Mac os 桌面应用

      创建应用
    2. 添加 OpenGl.frameworkGLUT.framework 两个系统库

      image
    3. 添加 GLTools.hglew.h

      将我们上面准备好的资料添加到项目里面,添加完成之后的项目结构应该是这样的

      • 项目结构
      image
      • 文件夹结构
      image
    4. 设置 search path

      • 设置 include 在项目中的相对路径
      image
    5. 删除系统自动创建的类

      • AppDelegate.h
      • AppDelegate.m
      • ViewController.h
      • ViewController.m
      • main.m
      删除类
    6. 创建新的入口文件

      • 选择 C++ 文件
      image
      • 反选创建头文件选项
      image

    三、配置 OpenGL 环境(代码配置)

    在 OpenGL 的学习阶段,我们要接触的代码以及代码的流程都是下面这几个步骤,所以呢,我们不会每次都从一个新的工程开始配置,而是直接沿用以前的工程。很多操作都是固定的,比如:ChangeSize、RenderScene 这些回调函数,不同的应用场景都会使用到。

    1. 导入头文件
    // GLTool 中的 着色器管理器(Shader Manager)类, 没有着色器, 我们就不能在 OpenGL(核心框架) 进行着色.
    // 着色管理器不仅允许我们创建并管理着色器, 还提供一组 "存储着色器", 他们能够进行一些初步的基本渲染操作.
    #include <GLShaderManager.h>
    // 包含大部分 GLTool 中类似C语言的独立函数
    #include "GLTools.h"
    // 在 Mac 系统下, `#include <GLUT/glut.h>`
    // 在 Windows 和 Linux 下, 我们使用宏 freeglut 的静态库版本需要添加一个宏
    #include <GLUT/glut.h>
    
    1. 创建两个全局变量
    // 定义一个 着色管理器
    GLBatch triangleBatch;
    // 简单的批次容器, 是 GLTools 的一个简单的容器类
    GLShaderManager shaderManager;
    
    1. 定义三个方法
    /// 窗口大小改变时接受新的宽度和高度,
    /// (0, 0) 代表窗口视图中的左下角坐标
    /// (w, h) 代表像素
    /// 通过 glutReshapeFunc(函数名) 注册为重塑函数
    void ChangeSize(int w, int h);
    /// 自定义函数, 设置需要渲染的图形的相关顶点数据/颜色数据等数据的准备工作
    void SetupRC();
    /// 自定义函数, 通过 glutDisplayFunc(函数名) 注册为显示渲染函数
    /// 当屏幕发生变化/或开发者主动渲染会调用此函数, 用来实现数据 -> 渲染过程
    void RenderScene(void);
    
    1. 编辑main方法
    int main(int argc, char* argv[]) {
        
        // 设置当前工作目录, 针对 Mac OS X
        gltSetWorkingDirectory(argv[0]);
        
        // MARK: 准备工作 >>>>>>begin
        // 初始化 GLUT 库
        glutInit(&argc, argv);
        
        // 初始化双缓冲区窗口, 其中标志:
        // GLUT_DOUBLE : 双缓冲窗口
        // GLUT_RGBA : RGBA颜色模式
        // GLUT_DEPTH : 深度测试
        // GLUT_STENCIL : 模板缓冲区
        glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
        
        // GLUT 窗口大小 / 标题窗口
        glutInitWindowSize(800, 600);
        glutCreateWindow("Triangle");
        
        // 注册回调函数
        glutReshapeFunc(ChangeSize);
        
        glutDisplayFunc(RenderScene);
        
        // 驱动程序的初始化中没有出现任何问题
        GLenum err = glewInit();
        
        if (err != GLEW_OK) {
            fprintf(stderr, "glew error : %s\n", glewGetErrorString(err));
            return 1;
        }
        // MARK: 准备工作 <<<<<<end
        //
        SetupRC();
        
        glutMainLoop();
        
        return 0;
    }
    
    1. 方法实现 ChangeSize
    void ChangeSize(int w, int h) {
        glViewport(0, 0, w, h);
    }
    
    1. 方法实现 SetupRC
    void SetupRC() {
        // 设置背景色
        glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
        
        // 初始化着色管理器
        shaderManager.InitializeStockShaders();
        
        // 设置三角形, 其中数组 vVerts 包含所有 3 个顶点的(x,y), 笛卡尔坐标对
        GLfloat vVerts[] = {
            -0.5f, 0.0f, 0.0f,
            0.5f, 0.0f, 0.0f,
            0.0f, 0.5f, 0.0f,
        };
        
        // 批次处理
        triangleBatch.Begin(GL_TRIANGLES, 3);
        triangleBatch.CopyVertexData3f(vVerts);
        triangleBatch.End();
    }
    
    1. 方法实现 RenderScene
    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);
        
        // 提交着色器
        triangleBatch.Draw();
        
        // 将在后台缓冲区进行渲染, 然后在结束时交换到前台
        glutSwapBuffers();
    }
    
    
    1. 查看效果
    • 初始化状态
    image
    • 改变屏幕尺寸之后
    image

    四、忽略警告⚠️

    在介绍 OpenGL 的学习阶段时候,笔者就提到过,第一个阶段的 OpenGL 学的都是固定着色器部分,属于比较老、容易上手的篇章。这个版本的 API 被设置为过期方法也不足为奇。

    所以在项目中,你会看到大量的这类警告。

    OpenGL API过期警告

    如果你有比较强烈的代码洁癖,你可以通过 xcode 的设置来忽略它

    忽略函数过期警告

    相关文章

      网友评论

          本文标题:03源码--001--OpenGL 环境搭建

          本文链接:https://www.haomeiwen.com/subject/xlrlqktx.html