资源准备
- 开发工具库 百度网盘下载,下载密码:go7l
开始配置
-
创建macOS应用程序(开发工具Xcode)
因为OpenGL是PC端的图形库,所以创建macOS应用程序
image.png -
添加OpenGl.framework 和 GLUT.framework系统库
image.png -
将开始准备的工具库拖入项目中
image.png -
将GLTool.h和glew.h 两个文件地址输入 Header Search Paths
image.png -
删除不需要的文件AppDelegate.h AppDelegate.m main.m ViewController.h ViewController.m,创建main.cpp
image.png -
编辑main.cpp文件,复制下面代码,测试是否已经搭建完成
#include "GLTools.h"
#include <GLUT/GLUT.h>
#include "GLShaderManager.h"
GLShaderManager manager ;
GLBatch triangleBatch;
//blockSize 边长
GLfloat blockSize = 0.1f;
GLfloat xPos,yPos = 0.0f ;
//正方形的4个点坐标
GLfloat vVerts[] = {
-blockSize,-blockSize,0.0f,
blockSize,-blockSize,0.0f,
blockSize,blockSize,0.0f,
-blockSize,blockSize,0.0f
};
/// 当屏幕大小改变时调用
void changeSize(int w,int h) {
// x,y 表示窗口中视图的左下角坐标
glViewport(0, 0, w, h);
}
/// 渲染场景
void renderScene() {
// 清除一个或一组特定缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
//设置红色
GLfloat vReds[] = {0.0,0.0,1.0,1.0};
// x,y,z,w
M3DMatrix44f mTransformMatrix,mFinalMatrix,mRotationMatrix ;
// 平移
m3dTranslationMatrix44(mTransformMatrix, xPos, yPos, 0.0);
static float zRot = 0.0 ;
zRot += 5.0;
m3dRotationMatrix44(mRotationMatrix, m3dDegToRad(zRot), 0, 0, 1);
m3dMatrixMultiply44(mFinalMatrix, mTransformMatrix, mRotationMatrix);
// 传递到存储着色器,即GLT_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形
manager.UseStockShader(GLT_SHADER_FLAT,mFinalMatrix,vReds);
// 提交着色器
triangleBatch.Draw();
//将后台缓冲区进行渲染,然后结束后交换给前台
glutSwapBuffers();
}
/// 设置渲染
void setupRC() {
// 设置清屏颜色
glClearColor(0.0, 0.0, 0.0, 1.0);
// 初始化一个渲染管理器
manager.InitializeStockShaders();
// 指定定点
// GLfloat vPoints[] = {
// -0.5,0,0,
// 0.5,0,0,
// 0,0.5,0
// };
triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
triangleBatch.CopyVertexData3f(vVerts);
triangleBatch.End();
}
void SpecialKeys(int key, int x, int y) {
GLfloat stepSize = 0.025f;
if (key == GLUT_KEY_UP) {
yPos += stepSize;
}
if (key == GLUT_KEY_DOWN) {
yPos -= stepSize;
}
if (key == GLUT_KEY_LEFT) {
xPos -= stepSize;
}
if (key == GLUT_KEY_RIGHT) {
xPos += stepSize;
}
//触碰到边界(4个边界)的处理
//当正方形移动超过最左边的时候
if (xPos < -1.0f + blockSize) {
xPos = -1.0f + blockSize;
}
//当正方形移动到最右边时
//1.0 - blockSize * 2 = 总边长 - 正方形的边长 = 最左边点的位置
if (xPos > (1.0 - blockSize)) {
xPos = 1.0f - blockSize;
}
//当正方形移动到最下面时
//-1.0 - blockSize * 2 = Y(负轴边界) - 正方形边长 = 最下面点的位置
if (yPos < -1.0f + blockSize) {
yPos = -1.0f + blockSize;
}
//当正方形移动到最上面时
if (yPos > 1.0f - blockSize) {
yPos = 1.0f - blockSize;
}
glutPostRedisplay();
}
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颜色模式、深度测试、模板缓冲区
--GLUT_DOUBLE`:双缓存窗口,是指绘图命令实际上是离屏缓存区执行的,然后迅速转换成窗口视图,这种方式,经常用来生成动画效果;
--GLUT_DEPTH`:标志将一个深度缓存区分配为显示的一部分,因此我们能够执行深度测试;
--GLUT_STENCIL`:确保我们也会有一个可用的模板缓存区。
深度、模板测试后面会细致讲到
*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
// 窗口初始化
glutInitWindowSize(800, 600);
// 创建窗口
glutCreateWindow("test");
/*
GLUT 内部运行一个本地消息循环,拦截适当的消息。然后调用我们不同时间注册的回调函数。我们一共注册2个回调函数:
1)为窗口改变大小而设置的一个回调函数
2)包含OpenGL 渲染的回调函数
*/
//注册重塑函数
glutReshapeFunc(changeSize);
//注册显示函数
glutDisplayFunc(renderScene);
//注册特殊函数
glutSpecialFunc(SpecialKeys);
/*
初始化一个GLEW库,确保OpenGL API对程序完全可用。
在试图做任何渲染之前,要检查确定驱动程序的初始化过程中没有任何问题
*/
GLenum status = glewInit();
if (GLEW_OK != status) {
printf("GLEW Error:%s\n",glewGetErrorString(status));
return 1;
}
//设置我们的渲染环境
setupRC();
// 开启运行循环
glutMainLoop();
return 0 ;
}
编译后,运行,如果能出现下面的图形,就说明搭建成功
image.png
(本文为学习笔记,相关资料来自CC老师)
网友评论