经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » iOS » 查看文章
Mac端 Open GL初探
来源:cnblogs  作者:春天里的花骨朵  时间:2018/11/8 9:43:23  对本文有异议

一、环境配置

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;

 

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

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

  1. //定义一个着色管理器
  2. GLShaderManager shaderManager;
  3. //GLTools的一个简单容器
  4. GLBatch triangleBatch;
  5. void drawSquare();
  6. void drawCircle();
  7. void drawSin();
  8. int moveSquare(int argc, char *argv[]);
  9. int playUpTriangle(int argc,char* argv[]);
  10. void changeSize(int w, int h);
  11. void specialKeys(int key, int x, int y);
  12. void renderScene();
  13. void setUpRC();
  14. void moveSSetUpRC();

 

//main函数中的准备工作

  1. //初始化一个GLUT库
  2. glutInit(&argc, (char **)argv);
  3. //创建窗口并命名
  4. glutCreateWindow("LYB_Window");
  5. //注册绘图函数
  6. glutDisplayFunc(draw);
  7. //开启循环:处理窗口和操作系统的用户输入等操作
  8. glutMainLoop();

 

  1. glutMainLoop();开启一个无线执行的循环事件,其后面的代码命令是不会执行的

 

//设置颜色

 

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

 

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

//绘制X、Y坐标轴

 

  1. //绘图模式:两点连成直线
  2. glBegin(GL_LINES);
  3. //绘制X轴
  4. glVertex2f(-1.0f, 0.0f);
  5. glVertex2f(1.0f, 0.0f);
  6. //绘制Y轴
  7. glVertex2f(0.0f, -1.0f);
  8. glVertex2f(0.0f, 1.0f);
  9. glEnd();

 

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

//绘制正线曲线

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

factor为0.1时的效果图

factor为0.5时的效果图

 

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

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

 

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

//main函数配置

  1. //设置当前工作目录——仅针对Mac OS
  2. gltSetWorkingDirectory(argv[0]);
  3. glutInit(&argc, (char **)argv);
  4. /*初始化双缓冲窗口
  5. GLUT_DOUBLE:双缓冲窗口;
  6. GLUT_RGBA:RGBA颜色模式;
  7. GLUT_DEPTH:深度测试;
  8. GLUT_STENCIL:模版缓冲区
  9. */
  10. glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
  11. //设置窗口大小
  12. glutInitWindowSize(800, 600);
  13. glutCreateWindow("MoveSquare");
  14. //注册重塑函数
  15. glutReshapeFunc(changeSize);
  16. //注册显示函数
  17. glutDisplayFunc(renderScene);
  18. glutSpecialFunc(specialKeys);
  19. //Open GL API可用和驱动程序初始化正常的容错判断
  20. GLenum status = glewInit();
  21. if (status != GLEW_OK) {
  22. printf("GLew Error : %s\n", glewGetErrorString(status));
  23. return 1;
  24. }
  25. //设置渲染环境
  26. moveSSetUpRC();
  27. glutMainLoop();

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

  1. void renderScene()
  2. {
  3. /*清楚缓存区
  4. GL_COLOR_BUFFER_BIT:指示当前激活的用来进行颜色写入的缓冲区
  5. GL_DEPTH_BUFFER_BIT:指示深度缓存区
  6. GL_STENCIL_BUFFER_BIT:指示模版缓存区
  7. */
  8. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
  9. //设置颜色
  10. GLfloat vRed[] = {1.0,0.0, 0.0, 1.0};
  11. //传递到存储着色器并在屏幕上渲染图形
  12. shaderManager.UseStockShader(GLT_SHADER_IDENTITY, vRed);
  13. //提交着色器
  14. triangleBatch.Draw();
  15. //后台缓冲区渲染结束后提交给前台
  16. glutSwapBuffers();
  17. }
  1. void specialKeys(int key, int x, int y)//key由系统自动识别获取
  2. {
  3. /*
  4. 判断:x值以正方形最左边为基准;y值以正方形最上边为基准;
  5. blockX、blockY值不能赋值于常量——因为vVerts四个点是动态变化的(SpecialKeys也会随之被动态调用);
  6. */
  7. GLfloat blockX = vVerts[0];
  8. GLfloat blockY = vVerts[10];
  9. GLfloat stepSize = 0.025;
  10. if (key == GLUT_KEY_UP) {
  11. blockY += stepSize;
  12. }
  13. if (key == GLUT_KEY_DOWN) {
  14. blockY -= stepSize;
  15. }
  16. if (key == GLUT_KEY_LEFT) {
  17. blockX -= stepSize;
  18. }
  19. if (key == GLUT_KEY_RIGHT) {
  20. blockX += stepSize;
  21. }
  22. //触碰到窗口边界处理
  23. if (blockX < -1.0) {
  24. blockX = -1.0;
  25. }
  26. if (blockX > (1.0-blockSize*2)) {
  27. blockX = 1.0-blockSize*2;
  28. }
  29. if (blockY > 1.0) {
  30. blockY = 1.0;
  31. }
  32. if (blockY < -1.0+blockSize*2) {
  33. blockY = -1.0+blockSize*2;
  34. }
  35. //正方形四个顶点坐标动态赋值
  36. vVerts[0] = blockX;
  37. vVerts[1] = blockY-blockSize*2;
  38. vVerts[3] = blockX+blockSize*2;
  39. vVerts[4] = blockY-blockSize*2;
  40. vVerts[6] = blockX+blockSize*2;
  41. vVerts[7] = blockY;
  42. vVerts[9] = blockX;
  43. vVerts[10] = blockY;
  44. triangleBatch.CopyVertexData3f(vVerts);
  45. glutPostRedisplay();
  46. }

 

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

 

github

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号