当前位置: 移动技术网 > IT编程>移动开发>IOS > Mac端 Open GL初探

Mac端 Open GL初探

2018年11月07日  | 移动技术网IT编程  | 我要评论

食为奴国语全集,合肥刘磬纤,上海治疗尖锐湿疣

一、环境配置

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运行效果如何上传到博客中?不胜感激!

 

github

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网