1.OpenGL是PC端的渲染库,所以在创建项目的时候,记住要创建Mac项目
创建.png2.删除所有的.h 、.m文件
3.创建main.cpp文件,记住不要勾选“Also create a header file”
注意:不要用之前mian.m中的main函数,要是用如下main函数。是因为mian.m函数的argv参数有const修饰符,在我们初始化glut库时,glutInit函数会报错
int main(int argc, char * argv[]) {
return 0;
}
main.png
4.下载libGLTools资源包下载地址
5.添加系统库OpenGL.framework和GLUT.framework
系统库.png6.将资源包中的include拖入项目中
image.png7.在header search path中,加入include的路径
path.png8.拖入libGLTools.a
libGLTools.png9.上代码,写出OpenGL的hello word
//OpenGL是跨平台的,只是一个标准,他没有所谓窗口的概念,但各种平台有自己的对应窗口,怎么办呢?GLTools就是解决这个问题的。
//GLTools是蓝宝书编写人员开发的库,是基于GLEW库的。这样我们就不用include<glew.h>而是include<GLTools.h>就可以了。GLTools里封装了用于操作矩阵和向量的3D数学库,并且有默认的shader可以渲染简单的3D对象。
#include "GLTools.h"
//glut是基本的窗口界面,是独立于gl和glu的,且是跨平台的。在Mac 系统下,`#include<glut/glut.h>`,在Windows 和 Linux上,GLUT的开发已经中断,我们使用freeglut代替,但freeglut的静态库版本并且需要添加一个宏
#include <glut/glut.h>
//简单批次容器,是GLTools的一个简单容器类
GLBatch triangleBatch;
//移入GLTool着色器管理器类,没有着色器,就无法使用OpenGL进行着色。所以,他的作用不仅可以创建并管理着色器,还能提供一组“存储着色器”。也可以说它是管理固定着色器的
GLShaderManager shaderManager;
//自定义函数,由glutReshaperFunc(fun)注册回调。窗口大小改变时接受新的宽度和高度,其中0,0代表窗口中视口的左下角坐标,w,h代表像素
//窗口大小改变/开发者第一次创建窗口时调用
void ChangeSize(int w,int h)
{
glViewport(0,0, w, h);
}
//为程序作一次性的设置
void SetupRC()
{
//设置背影颜色
glClearColor(0.5f,0.1f,1.0f,1.0f);
//没有着色器,在OpenGL 核心框架中是无法进行任何渲染的。初始化一个渲染管理器。
//在前面的课程,我们会采用固管线渲染,后面会学着用OpenGL着色语言来写着色器
shaderManager.InitializeStockShaders();
//设置三角形,其中数组vVert包含所有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);
//将顶点数据copy到顶点缓冲区
triangleBatch.CopyVertexData3f(vVerts);
//结束
triangleBatch.End();
}
//开始渲染,是一个自定义函数,有系统触发调用。他其实是glutDisplayFunc(fun)注册的函数,当屏幕发生改变/开发者主动渲染时,会被触发
void RenderScene(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[] = {.5f,0.8f,0.3f,1.0f};
//传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形
shaderManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
//提交着色器
triangleBatch.Draw();
//在开始的设置openGL 窗口的时候,我们指定要一个双缓冲区的渲染环境。这就意味着将在后台缓冲区进行渲染,渲染结束后交换给前台。这种方式可以防止观察者看到可能伴随着动画帧与动画帧之间的闪烁的渲染过程。缓冲区交换平台将以平台特定的方式进行。
//将后台缓冲区进行渲染,然后结束后交换给前台
glutSwapBuffers();
}
int main(int argc, char * argv[]) {
//系统配置初始化
//设置当前工作目录,针对MAC OS X
// gltSetWorkingDirectory(argv[0]);
//初始化GLUT库,这个函数只是传说命令参数并且初始化glut库
glutInit(&argc, argv);
/*初始化双缓冲窗口,其中标志GLUT_DOUBLE、GLUT_RGBA、GLUT_DEPTH、GLUT_STENCIL分别指
双缓冲窗口、RGBA颜色模式、深度测试、模板缓冲区*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//GLUT窗口大小,标题窗口
glutInitWindowSize(800,600);
glutCreateWindow("Triangle");
/*
GLUT 内部运行一个本地消息循环,拦截适当的消息。然后调用我们不同时间注册的回调函数。我们一共注册2个回调函数:
1)为窗口改变大小而设置的一个回调函数
2)包含OpenGL 渲染的回调函数
*/
//注册回调函数
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();
//开启runloop,捕获窗口改变及渲染消息
glutMainLoop();
return 0;
}
网友评论