欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Mac端 Open GL初探

程序员文章站 2022-09-29 09:18:09
一、环境配置 1.创建macOS工程 2.添加OpenGL.framework和GLUT.framework两个系统库 3.拖入资源文件 如果libGLTools.a问价先拖入到工程其他位置,后再移到frameworks文件夹下,则链接错误 4.配置include文件夹的位置 此处是相对位置:“$( ......

一、环境配置

1.创建macos工程

Mac端 Open GL初探

 

2.添加opengl.framework和glut.framework两个系统库

Mac端 Open GL初探

 

3.拖入资源文件

Mac端 Open GL初探

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

Mac端 Open GL初探

 

 

4.配置include文件夹的位置

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

Mac端 Open GL初探

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

Mac端 Open GL初探

Mac端 Open GL初探

Mac端 Open GL初探

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

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

 

 

二、头文件引用

glshadermanager.h文件引用须放在gltools.h和glut/glut.h文件之前,否则会找不到相关头文件

Mac端 Open GL初探

 

三、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时的效果图

Mac端 Open GL初探

factor为0.5时的效果图

Mac端 Open GL初探

 

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

//强制刷新缓存区,保证绘制命令得以执行
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