Open GL工程的搭建

2020-07-18  本文已影响0人  shawnr

引子:移动端开发经过这么多年的开发,已经越来越成熟了,而且由于网页端技术的野蛮发展,移动端开发已经越来越式微啦。在这个环境下深耕iOS原生和努力掌握大前端技术栈对于iOS开发者来说越发的重要。基于图形和视频技术的流行趋势,掌握图形和视频的渲染技术栈也显得越发重要。本篇介绍如果在Xcode搭建Open GL 工程。
该篇文章简单的搭建一个在MAC的OpenGL工程,以及对代码进行解释

#include <stdio.h>

#include "GLTools.h"
/*
 GLTool.h头文件包含了大部分GLTool中类似C语言的独立函数
*/
#include <GLUT/GLUT.h>
/*
 在Mac 系统下,`#include<glut/glut.h>`
 在Windows 和 Linux上,我们使用freeglut的静态库版本并且需要添加一个宏
 */
#include "GLShaderManager.h"
/*
`#include<GLShaderManager.h>` 移入了GLTool 着色器管理器(shader Mananger)类。没有着色器,我们就不能在OpenGL(核心框架)进行着色。着色器管理器不仅允许我们创建并管理着色器,还提供一组“存储着色器”,他们能够进行一些初步䄦基本的渲染操作。
*/

GLBatch triangleBatch;// 简单的批次容器,是GLTools的一个简单的容器类。
GLShaderManager shaderManager;// 定义一个着色管理器

/// 窗口大小改变时接受新的宽度和高度,其中(0,0)代表窗口的左下角坐标,w、h代表像素
void changeSize(int w, int h) {
    glViewport(0, 0, w, h);
}

/// 做初始花设置
void setupRC(){
    /// 设置背景颜色
    glClearColor(1.f, 1.f, 1.f, 1.f);
    /// 初始化着色管理器
    shaderManager.InitializeStockShaders();
    /// 设置三角形,其中数组vVert包含所有3个顶点的x,y,笛卡尔坐标对。
    GLfloat vVerts[] = {
        -1.f, -1.f, 0.f,
        0.5f, 0.f, 0.f,
        -0.6f, 0.5f, 0.f
    };
    /// 批次处理
    triangleBatch.Begin(GL_TRIANGLES, 3);
    triangleBatch.CopyVertexData3f(vVerts);
    triangleBatch.End();
}

/// 开始渲染
void renderScene(void) {
    /// 清除一个或一组特定的缓冲区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    /// 设置一组浮点数表示红色
    GLfloat vRed[] = {1.f, 0.f, 0.f, 1.f};
    /// 传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标系在屏幕上渲染集合图形
    shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
    /// 提交着色器
    triangleBatch.Draw();
    /// 将在后台缓冲区进行渲染,然后再结束时交换到前台
    glutSwapBuffers();
}

int main(int argc, char * argv[]) {
    /// 设置当前工作目录,针对MAC OS X,防止在Windows上错误。在Windows中是没必要的。因为windows下默认的工作目录就是与程序可执行目录相同。但是在Mac OS中工作目录被更改为应用程序捆绑中的/Resource文件夹。
    gltSetWorkingDirectory(argv[0]);
    /// 初始化GLUT库,GLUT库的api在macOS 10.9 已被弃,但不影响使用
    glutInit(&argc, argv);
    /// 初始化双缓存窗口 GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL 分别是:双缓存窗口、RGBA颜色模式、深度测试、模板缓冲区
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL);
    /// GLUT窗口,设置窗口大小
    glutInitWindowSize(800, 800);
    /// 设置窗口标题 
    glutCreateWindow("Triangle");
    /// 注册回调
    glutReshapeFunc(changeSize);// 注册重塑函数
    glutDisplayFunc(renderScene);// 注册显示函数
    
    /// 驱动程序的初始化无问题,初始化GLEW库,确保OpenGL API对程序完全可用。
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "glew error: %s\n",glewGetErrorString(err));
        return 1;
    }
    /// 调用setupRC,设置渲染环境
    setupRC();
    /// 进入GLUT事件处理循环,让所有的与“事件”有关的函数调用无限循环,这里让整个绘图循环进行。它将调用必要的任何已注册的回调
    glutMainLoop();
    return 0;
}
OpenGL-triangle.png
程序入口main函数代码解读:
对应宏定义 意义
GLUT_RGB 0x0000 指定RGB颜色模式的窗口
GLUT_RGBA 0x0000 指定RGBA颜色模式的窗口
GLUT_INDEX 0x0001 指定颜色索引模式的窗口
GLUT_SINGLE 0x0000 指定单缓存窗口
GLUT_DOUBLE 0x0002 指定双缓存窗口
GLUT_ACCUM 0x0004 窗口使用累加缓存
GLUT_ALPHA 0x0008 窗口的颜色分量包含 alpha 值
GLUT_DEPTH 0x0010 窗口使用深度缓存
GLUT_STENCIL 0x0020 窗口使用模板缓存
GLUT_MULTISAMPLE 0x0080 指定支持多样本功能的窗口
GLUT_STEREO 0x0100 指定立体窗口
GLUT_LUMINANCE 0x0200 窗口使用亮度颜色模型
setupRC函数解读:
renderScene函数解读
上一篇下一篇

猜你喜欢

热点阅读