OpenGL & Metal

Mac下的OpenGL环境搭建

2020-07-02  本文已影响0人  黑眼豆豆_

准备资源

百度网盘地址:链接: https://pan.baidu.com/s/1aNYP7sP4p3W6PQoWPsrI9Q
提取码: t3vw

OpenGLg环境搭建

1.打开Xcode -> macOS -> Cocoa Application

image.png.png

2.添加OpenGL.framework和GLUT.framework两个库文件

点击项目 -> 选择TARGETS -> 选择Build Phases -> 选择Link Binary With Libraries -> 点击加号 -> 添加2个freamworks文件


图2.png

添加完成后页面如下:


image.png

3.添加CLGtools.h,glew.h

操作方式如图


image.png

4.修改libGLTools.a的路径

将项目中的libGLTools.a拖到Frameworks中


image.png

将多余的AppDelegate、ViewController、main文件(图中忘了删了,各位可以放心大胆的删除)删除


image.png
创建main.cpp文件,command+N新建文件,选择C++ File
image.png

此处不用勾选"Also create a header file"


image.png

5.这样环境就已经搭好了,接下来就用一段代码来测试一下吧

OpenGLg环境测试

复制以下代码到main.cpp文件中

//  main.cpp
//  OpenGLTest
//
//  Created by leosun on 2020/7/2.
//  Copyright © 2020 leosun. All rights reserved.
//

#include <stdio.h>
#include "GLTools.h"
#include <GLUT/GLUT.h>
#define GL_SILENCE_DEPRECATION
GLBatch triangleBatch;
GLShaderManager shadeManager;
GLfloat blockSize = 0.1f;
GLfloat vVerts[] = {
    -blockSize,-blockSize,0.0f,
    blockSize,-blockSize,0.0f,
    blockSize,blockSize,0.0f,
    -blockSize,blockSize,0.0f,
};

//窗口大小改变时接受新的宽度和高度,其中0,0代表窗口中视口的左下角坐标,w、h代表像素
void ChangeSize(int w,int h){
    glViewport(0, 0, w, h);
}

//为程序作一次性的设置
void setupRC(){
    //设置背景颜色
    glClearColor(1.f,215.f/255.f,0.f, 1.0f);
    //初始化着色管理器
    shadeManager.InitializeStockShaders();
    //设置三角形,其中数组vVert包含所有3个顶点的x,y,笛卡尔坐标对

    //批次处理
  triangleBatch.Begin(GL_TRIANGLE_FAN, 4);
    triangleBatch.CopyVertexData3f(vVerts);
    triangleBatch.End();
}

//开始渲染
void RenderScene(void){
    //清除一个或一组特定的缓冲区
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    //设置一组浮点数来表示红色
    GLfloat vRed [] = {
        1.0f,0.0f,0.0f,1.0f
    };
    //传递到存储着色器,即GL_SHADER_IDENTITY着色器,这个着色器只是使用指定颜色以默认笛卡尔坐标第在屏幕上渲染几何图形
    shadeManager.UseStockShader(GLT_SHADER_IDENTITY,vRed);
    //提交着色器
    triangleBatch.Draw();
    //在后台缓冲区进行渲染,然后在结束时交换到t前台
    glutSwapBuffers();
}

void SpecialKeys(int key, int x, int y){
    GLfloat stepSize = 0.1f;
    
    GLfloat blockX = vVerts[0];
    GLfloat blockY = vVerts[10];
    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.0f) {
        blockX = -1.0f;
    }
    //当正方形移动到最右边时
    //1.0 - blockSize * 2 = 总边长 - 正方形的边长 = 最左边点的位置
    if (blockX > (1.0 - blockSize * 2)) {
        blockX = 1.0f - blockSize * 2;
    }
    
    //当正方形移动到最下面时
    //-1.0 - blockSize * 2 = Y(负轴边界) - 正方形边长 = 最下面点的位置
    if (blockY < -1.0f + blockSize * 2 ) {
        blockY = -1.0f + blockSize * 2;
    }
    
    //当正方形移动到最上面时
    if (blockY > 1.0f) {
        blockY = 1.0f;
    }
    
    printf("blockX = %f\n",blockX);
    printf("blockY = %f\n",blockY);
    
    // Recalculate vertex positions
    vVerts[0] = blockX;
    vVerts[1] = blockY - blockSize*2;
    
    printf("(%f,%f)\n",vVerts[0],vVerts[1]);
    
    
    vVerts[3] = blockX + blockSize*2;
    vVerts[4] = blockY - blockSize*2;
    printf("(%f,%f)\n",vVerts[3],vVerts[4]);
    
    vVerts[6] = blockX + blockSize*2;
    vVerts[7] = blockY;
    printf("(%f,%f)\n",vVerts[6],vVerts[7]);
    
    vVerts[9] = blockX;
    vVerts[10] = blockY;
    printf("(%f,%f)\n",vVerts[9],vVerts[10]);
    
    triangleBatch.CopyVertexData3f(vVerts);
    
//    glutPostRedisplay();
    glutPostRedisplay();
}

int main (int agrc,char* argv[]){
    //设置当前工作目录,针对MAC OS X
    gltSetWorkingDirectory(argv[0]);
    //初始化GLUT库
    glutInit(&agrc, argv);
    /**初始化双缓冲窗口,其中标志GLUT_DOUBLE,GLUT_RGBA,GLUT_DEPTH,GLUT_STENCIL分别指
     双缓冲窗口,RGBA颜色模式,深度测试,模板缓冲区
     */
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH|GLUT_STENCIL);
    glutInitWindowSize(800, 600);
    glutCreateWindow("Triangle");
   /*
    GLUT 内部运行一个本地消息循环,拦截适当的消息。然后调用我们不同时间注册的回调函数。我们一共注册2个回调函数:
    1)为窗口改变大小而设置的一个回调函数
    2)包含OpenGL 渲染的回调函数
    */
    glutReshapeFunc(ChangeSize);
    glutDisplayFunc(RenderScene);
    glutSpecialFunc(SpecialKeys);
    //驱动程序的初始化中没有出现任何问题
    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "glew error:%s\n",glewGetErrorString(err));
        return 1;
    }
    //调用SetupRC
    setupRC();
    glutMainLoop();
    return 0;
}

编译运行,接下来就是见证奇迹的时刻了!!!


image.png

好了,到此咱们的环境就搭成功了!!! 各位可以愉快的开干了。


Wait,我这竟然报错了。在看到成果之前我心爱的代码竟然报错了。

image.png

然后就开启了漫长而漫长的百度之路。。

震惊,最后这样解决

image.png
看到区别了吗!对的,我把libGLTools.a挪到最上面就好了,这个bug也是相当的无厘头了,希望遇到同样问题的同学可以试试!当然,如果哪位大神知道原理,那也是希望各位能够不吝赐教!!

现在环境才算真正的搭好,各位就去愉快的玩耍吧!!!

上一篇下一篇

猜你喜欢

热点阅读