Mac端 Open GL初探
程序员文章站
2022-09-29 09:18:09
一、环境配置 1.创建macOS工程 2.添加OpenGL.framework和GLUT.framework两个系统库 3.拖入资源文件 如果libGLTools.a问价先拖入到工程其他位置,后再移到frameworks文件夹下,则链接错误 4.配置include文件夹的位置 此处是相对位置:“$( ......
一、环境配置
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[0]); glutinit(&argc, (char **)argv); /*初始化双缓冲窗口 glut_double:双缓冲窗口; glut_rgba:rgba颜色模式; glut_depth:深度测试; glut_stencil:模版缓冲区 */ glutinitdisplaymode(glut_double|glut_rgba|glut_depth|glut_stencil); //设置窗口大小 glutinitwindowsize(800, 600); 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 1; } //设置渲染环境 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[0]; glfloat blocky = vverts[10]; 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*2)) { blockx = 1.0-blocksize*2; } if (blocky > 1.0) { blocky = 1.0; } if (blocky < -1.0+blocksize*2) { blocky = -1.0+blocksize*2; } //正方形四个顶点坐标动态赋值 vverts[0] = blockx; vverts[1] = blocky-blocksize*2; vverts[3] = blockx+blocksize*2; vverts[4] = blocky-blocksize*2; vverts[6] = blockx+blocksize*2; vverts[7] = blocky; vverts[9] = blockx; vverts[10] = blocky; trianglebatch.copyvertexdata3f(vverts); glutpostredisplay(); }
请问下:录好的视频demo运行效果如何上传到博客中?不胜感激!
上一篇: 装修公司网站建设出现的几大常见问题大剖析
下一篇: UG中使用圆弧线段创建圆柱体的两种方法