03源码--001--OpenGL 环境搭建
2020-07-02 本文已影响0人
修_远
[TOC]
一、准备条件
- Mac设备一台(iOS开发者必备)
- glew
- GLTools
- libGLTools.a
二、配置 OpenGL 环境(项目设置)
-
创建一个 Mac os 桌面应用
创建应用 -
添加
imageOpenGl.framework
和GLUT.framework
两个系统库 -
添加
GLTools.h
和glew.h
将我们上面准备好的资料添加到项目里面,添加完成之后的项目结构应该是这样的
- 项目结构
- 文件夹结构
-
设置 search path
- 设置 include 在项目中的相对路径
-
删除系统自动创建的类
- AppDelegate.h
- AppDelegate.m
- ViewController.h
- ViewController.m
- main.m
-
创建新的入口文件
- 选择 C++ 文件
- 反选创建头文件选项
三、配置 OpenGL 环境(代码配置)
在 OpenGL 的学习阶段,我们要接触的代码以及代码的流程都是下面这几个步骤,所以呢,我们不会每次都从一个新的工程开始配置,而是直接沿用以前的工程。很多操作都是固定的,比如:ChangeSize、RenderScene 这些回调函数,不同的应用场景都会使用到。
- 导入头文件
// GLTool 中的 着色器管理器(Shader Manager)类, 没有着色器, 我们就不能在 OpenGL(核心框架) 进行着色.
// 着色管理器不仅允许我们创建并管理着色器, 还提供一组 "存储着色器", 他们能够进行一些初步的基本渲染操作.
#include <GLShaderManager.h>
// 包含大部分 GLTool 中类似C语言的独立函数
#include "GLTools.h"
// 在 Mac 系统下, `#include <GLUT/glut.h>`
// 在 Windows 和 Linux 下, 我们使用宏 freeglut 的静态库版本需要添加一个宏
#include <GLUT/glut.h>
- 创建两个全局变量
// 定义一个 着色管理器
GLBatch triangleBatch;
// 简单的批次容器, 是 GLTools 的一个简单的容器类
GLShaderManager shaderManager;
- 定义三个方法
/// 窗口大小改变时接受新的宽度和高度,
/// (0, 0) 代表窗口视图中的左下角坐标
/// (w, h) 代表像素
/// 通过 glutReshapeFunc(函数名) 注册为重塑函数
void ChangeSize(int w, int h);
/// 自定义函数, 设置需要渲染的图形的相关顶点数据/颜色数据等数据的准备工作
void SetupRC();
/// 自定义函数, 通过 glutDisplayFunc(函数名) 注册为显示渲染函数
/// 当屏幕发生变化/或开发者主动渲染会调用此函数, 用来实现数据 -> 渲染过程
void RenderScene(void);
- 编辑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;
}
- 方法实现
ChangeSize
void ChangeSize(int w, int h) {
glViewport(0, 0, w, h);
}
- 方法实现
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();
}
- 方法实现
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();
}
- 查看效果
- 初始化状态
- 改变屏幕尺寸之后
四、忽略警告⚠️
在介绍 OpenGL 的学习阶段时候,笔者就提到过,第一个阶段的 OpenGL 学的都是固定着色器部分,属于比较老、容易上手的篇章。这个版本的 API 被设置为过期方法也不足为奇。
所以在项目中,你会看到大量的这类警告。
OpenGL API过期警告如果你有比较强烈的代码洁癖,你可以通过 xcode 的设置来忽略它
忽略函数过期警告