一、环境配置

1.创建macOS工程

2.添加OpenGL.framework和GLUT.framework两个系统库

3.拖入资源文件

如果libGLTools.a问价先拖入到工程其他位置,后再移到frameworks文件夹下,则链接错误

4.配置include文件夹的位置

此处是相对位置:“$(SRCROOT)/”+“Mac环境搭建/”

5.删除代理等文件,并创建C++ main文件

6.复制一部分demo中的代码,编译

报错的引用的头文件的引用方式,按照提示”fix”即可——尖括号改成双引号

二、头文件引用

GLShaderManager.h文件引用须放在GLTools.h和GLUT/GLUT.h文件之前,否则会找不到相关头文件

三、OpenGL坐标系认识

1.以面对屏幕为准:向右为X轴正方向,向上为Y轴正方向,从屏幕由里到外为Z轴正方向;

2.坐标系范围(X、Y、Z轴):-1到1;

五、图形绘制——以正弦函数图形为例

//定义全局变量和函数声明

//定义一个着色管理器
GLShaderManager shaderManager;
//GLTools的一个简单容器
GLBatch triangleBatch; void drawSquare();
void drawCircle();
void drawSin(); int moveSquare(int argc, char *argv[]);
int playUpTriangle(int argc,char* argv[]);
void changeSize(int w, int h);
void specialKeys(int key, int x, int y);
void renderScene();
void setUpRC();
void moveSSetUpRC();

//main函数中的准备工作

//初始化一个GLUT库
glutInit(&argc, (char **)argv);
//创建窗口并命名
glutCreateWindow("LYB_Window");
//注册绘图函数
glutDisplayFunc(draw);
//开启循环:处理窗口和操作系统的用户输入等操作
glutMainLoop();
glutMainLoop();开启一个无线执行的循环事件,其后面的代码命令是不会执行的

//设置颜色

//设置窗口背景颜色:red\green\blue\alpha
glClearColor(0.3f, 0.2f, 0.1f, 0.0f);
//清除缓存区
glClear(GL_COLOR_BUFFER_BIT);
//设置图形颜色
glColor3f(0.0f, 0.0f, 1.0f);

windows颜色取值范围:0~255;iOS,macOS取值范围:0~1浮点值

//绘制X、Y坐标轴

//绘图模式:两点连成直线
glBegin(GL_LINES);
//绘制X轴
glVertex2f(-1.0f, 0.0f);
glVertex2f(1.0f, 0.0f);
//绘制Y轴
glVertex2f(0.0f, -1.0f);
glVertex2f(0.0f, 1.0f);
glEnd();

glBegin(GL_LINES)渲染开始,glEnd()渲染结束

//绘制正线曲线

//绘图模式:绘制连续的直线
glBegin(GL_LINE_STRIP);
//factor值越大,则正弦周期越长;反之,越小
const GLfloat factor = 0.1f;
GLfloat x;
for (x=-1.0f/factor; x<1.0f/factor; x+=0.01f) {
//y=k*sinx为正弦函数,k>0,原点左侧半个周期处在第二象限;k<0为第三象限
glVertex2f(x*factor, sin(x)*factor);
}
glEnd();

factor为0.1时的效果图

factor为0.5时的效果图

注:如果以下代码未写,则以上所有的绘制渲染代码都将无效

//强制刷新缓存区,保证绘制命令得以执行
glFlush();

六、方向键控制正方形方块移动

//main函数配置

    //设置当前工作目录——仅针对Mac OS
gltSetWorkingDirectory(argv[]); glutInit(&argc, (char **)argv);
/*初始化双缓冲窗口
GLUT_DOUBLE:双缓冲窗口;
GLUT_RGBA:RGBA颜色模式;
GLUT_DEPTH:深度测试;
GLUT_STENCIL:模版缓冲区
*/
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
//设置窗口大小
glutInitWindowSize(, );
glutCreateWindow("MoveSquare"); //注册重塑函数
glutReshapeFunc(changeSize);
//注册显示函数
glutDisplayFunc(renderScene);
glutSpecialFunc(specialKeys); //Open GL API可用和驱动程序初始化正常的容错判断
GLenum status = glewInit();
if (status != GLEW_OK) {
printf("GLew Error : %s\n", glewGetErrorString(status));
return ;
} //设置渲染环境
moveSSetUpRC();
glutMainLoop();

//renderScene()函数控制渲染,specialKeys()控制移动,二者,每次按一下键盘中的方向键,就会被动态调用一次

void renderScene()
{
/*清楚缓存区
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.0,0.0, 0.0, 1.0};
//传递到存储着色器并在屏幕上渲染图形
shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
//提交着色器
triangleBatch.Draw();
//后台缓冲区渲染结束后提交给前台
glutSwapBuffers();
}
void specialKeys(int key, int x, int y)//key由系统自动识别获取
{
/*
判断:x值以正方形最左边为基准;y值以正方形最上边为基准;
blockX、blockY值不能赋值于常量——因为vVerts四个点是动态变化的(SpecialKeys也会随之被动态调用);
*/
GLfloat blockX = vVerts[];
GLfloat blockY = vVerts[];
GLfloat stepSize = 0.025; if (key == GLUT_KEY_UP) {
blockY += stepSize;
} if (key == GLUT_KEY_DOWN) {
blockY -= stepSize;
} if (key == GLUT_KEY_LEFT) {
blockX -= stepSize;
} if (key == GLUT_KEY_RIGHT) {
blockX += stepSize;
} //触碰到窗口边界处理
if (blockX < -1.0) {
blockX = -1.0;
} if (blockX > (1.0-blockSize*)) {
blockX = 1.0-blockSize*;
} if (blockY > 1.0) {
blockY = 1.0;
} if (blockY < -1.0+blockSize*) {
blockY = -1.0+blockSize*;
} //正方形四个顶点坐标动态赋值
vVerts[] = blockX;
vVerts[] = blockY-blockSize*; vVerts[] = blockX+blockSize*;
vVerts[] = blockY-blockSize*; vVerts[] = blockX+blockSize*;
vVerts[] = blockY; vVerts[] = blockX;
vVerts[] = blockY; triangleBatch.CopyVertexData3f(vVerts); glutPostRedisplay();
}

请问下:录好的视频demo运行效果如何上传到博客中?不胜感激!

github

最新文章

  1. fastJson使用
  2. paper 121 :matlab中imresize函数
  3. Python基础之:List
  4. keepalived +mysql 实战
  5. Fresco源码解析 - 创建一个ImagePipeline(一)
  6. javascript encodeURI和encodeURIComponent的比较
  7. Convolution and Deconvolution
  8. Python中lambda表达式学习
  9. PC硬件之我见——CPU篇
  10. 服务器之间免密码ssh登陆
  11. objective-c 加号 减号 - +
  12. guestfish 修改 image file
  13. R0:前瞻
  14. [转]GET,POST,PUT,DELETE的区别
  15. Android开发中的安全
  16. WebView,我已经长大了,知道自己区分是否安全了!
  17. udf提权
  18. 30个php操作redis常用方法代码例子(转载)
  19. [日常工作]GS使用消息队列进行凭证实时记账 提高性能配置方法
  20. python:获取访问访问时的响应时间

热门文章

  1. 使用WebDAV实现Office文档在线编辑
  2. CentOS7.4 + Hadoop2.9安装配置管理(分布式)
  3. 安卓脱壳&amp;&amp;协议分析&amp;&amp;burp辅助分析插件编写
  4. leetCode题解之字符最短路径解法2
  5. ElasticSearch入坑指南之概述及安装
  6. 使用CoreData [2]
  7. 远程计算机 进程/服务 启动停止(WMI)
  8. UNIX高级环境编程(1)File I/O
  9. windows安装及配置mysql5.7
  10. September 04th 2017 Week 36th Monday