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

2020-07-02  本文已影响0人  修_远

[TOC]

一、准备条件

蓝宝书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 的设置来忽略它

忽略函数过期警告
上一篇下一篇

猜你喜欢

热点阅读