OpenGL学习 - Mac OS 下OpenGL环境搭建
一、工程创建 OpenGLLession01
1、找开Xcode -> macOS -> App
2、添加系统库文件 OpenGL.framework GLUT.framework
二、添加静态库文件
1、拖入libGLTools.a静态库与头文件
网盘库文件 密码: bmi3
2、工程配置: 1、在BuildSettings 中,找到 Header Searchh Paths ,将glew.h与GLTools.h所在的文件夹目录拖到 Header Search Paths 后面去,如下图所示:
3、删除文件 AppDelegate.h / AppDelegate.m ViewController.h / ViewController.m * main.m
4、创建 main.cpp文件
4添加代码如下:
#include <stdio.h>
// GLTools.h 头文件中包含了大部分的GLTool中类似c语言的独立函数
#include "GLTools.h"
#include "GLShaderManager.h"
#include <GLUT/GLUT.h>
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmacro-redefined"
/* 定义一个着色管理器,没有着色器,我们就不能在OpenGL(核心框架)进行着色。
着色器管理器不仅允许我们创建并管理着色器,还提供一组“存储着色器“,他们能够进行一些初步的基本渲染操作
*/
GLShaderManager shaderManager;
// 简单的批次容器
GLBatch triangleBatch;
/**
* 说明:在窗口大小改变时,接收新的宽度与高度
*/
void DffdChangeSizeFun(int nWidth, int nHeigh) {
// x,y 参数代表窗口中视图的左下角坐标,而宽度、高度是像素的表示,通常x,y都是0
glViewport(0, 0, nWidth, nHeigh);
}
void DffdRenderSceneFun(void) {
/* 清除一个或一组特定的缓冲区
缓冲区是一块存在图像信息的储存空间,红、绿、蓝和alpha分量通常一起作为颜色缓冲区或像素缓冲区引用。
OpenGL中不止一种缓冲区(颜色缓冲区、深度缓冲区和模板缓冲区)
清除缓冲区对数值进行预置
参数:指定要清除的缓存
GL_COLOR_BUFFER_BIT : 指示当前激活的用来进行颜色写入的缓冲区
GL_DEPTH_BUFFER_BIT : 指示深度缓冲区
GL_STENCIL_BUFFER_BIT : 指示模板缓冲区
*/
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();
/*
在开始的设置OpenGL窗口的时候,我们指定要一个双缓冲区的渲染环境。这就意味着将在后台缓冲区进行渲染,渲染结束后交换给前台。这种方式可以防止观察者看到可能伴随着动画帧与动画帧之间的闪烁的渲染过程。缓冲区交换平台将以平台特定的方式进行
*/
// 将后台缓冲区进行渲染,然后结束后交换给前台
glutSwapBuffers();
}
void DffdSetupRCFun () {
// 设置清屏颜色(背景颜色)
glClearColor(0.0, 0.50, 0.5, 1.0f);
// 初始化一个渲染管理器,没有着色器,在OpenGL核心框架中是无法进行任何渲染操作。
shaderManager.InitializeStockShaders();
// 确定绘制顶点数据
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();
}
int main(int argc, char *argv[]) {
// 初始化GLUT库,这个函数只是传命令参数并且初始化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("绘制三角形");
// 注册重塑函数
/**
* GLUT 内部运行一个本地消息循环,拦截适当的消息。然后调用我们不同时间注册的回调函数,我们一共注册两个回调函数
* 为窗口改变大小而设置的一个回调函数(DffdChangeSizeFun)
* 包含OpenGL 渲染的回调函数(DffdRenderSceneFun)
*/
glutReshapeFunc(DffdChangeSizeFun);
glutDisplayFunc(DffdRenderSceneFun);
// 初始化一个GLEW库,确保OpenGL API对程序完全可用
GLenum status = glewInit();
if ( GLEW_OK != status ) {
printf("GLEW Error:%sn", glewGetErrorString(status));
return 1;
}
// 设置我们的渲染环境
DffdSetupRCFun();
glutMainLoop();
return 0;
}
网盘Demo 密码: i7bl