mac配置OpenGL超级宝典(第7版)环境

今天奔着编过能跑的原则配置了OpenGL超级宝典的环境

版本说明

Mac OS X : 12.1
GLFW : 3.3.6
GLEW : 2.1.0

环境配置

  1. 配置cmake,后面用来部署GLFW用的。
  2. 配置Command Line Tool,也是用来编GLFW的,不然cmake会失败
    $ xcode-select --install
  3. GLFW+GLEW环境配置GLFW+GLAD环境配置有详细教程,我就偷个懒不再赘述
  4. 创建好Command Line Tool工程,配置searchpath时header search paths不能设置为递归,我本机环境很混乱,配置递归后会导致各种莫名其妙的编译错误
    在这里插入图片描述
  5. 设置compile sources为Objective-C++,我这边出现了unknown type name 'NSString’的错误,这样设置就可以了
    在这里插入图片描述
  6. 将书上的资源拷贝进来,在书上目录前一页有本书的配套资源下载教程(我看的是译版,如果有大佬看原版请忽略),下载地址,或者去异步社区搜索opengl超级宝典,然后点击配套资源就可以看到资源下载链接,这里有点坑要登陆才能跳转下载链接
  7. 拷贝配置资源里的一些代码到自己的项目里,我这边的文件目录如下
    在这里插入图片描述
  8. 为了编译通过我把一些报错的尖括号的include改为双引号,这里需要一个一个改好
  9. 可能是我的卡只支持到410,大家可以在appstore下载glview查看自己的opengl版本号,glCreateVertexArrays是4.5才有所以不能用,只能用glGenVertexArrays替换,shader的version不能和书上一样为450,我这里用的是330,下面附一份代码
    在这里插入图片描述
#include "sb7.h"

GLuint compile_shaders(void)
{
    GLuint vertex_shader;
    GLuint fragment_shader;
    GLuint program;
    
//    static const GLchar * vertex_shader_source[] =
//    {
//        "#version 450 core                              \n"
//        "                                               \n"
//        "void main(void)                                \n"
//        "{                                              \n"
//        "   gl_Position = verc4(0.0, 0.0, 0.5, 1.0);    \n"
//        "}                                              \n"
//    };
    
    static const GLchar * vertex_shader_source[] =
    {
        "#version 330 core                                               \n"
        "void main(void)\n"
        "{\n"
        "   const vec4 vertices[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1.0),\n"
        "                                    vec4(-0.25, -0.25,0.5, 1.0),\n"
        "                                    vec4(0.25, 0.25, 0.5, 1.0));\n"
        "   gl_Position = vertices[gl_VertexID];\n"
        "}\n"
    };
    
    static const GLchar * fragment_shader_source[] =
    {
        "#version 330 core\n"
        "out vec4 color;\n"
        "void main(void)\n"
        "{\n"
        "   color = vec4(0.0, 0.8, 1.0, 1.0);\n"
        "}\n"
    };
    
    vertex_shader = glCreateShader(GL_VERTEX_SHADER); //创建一个空的着色器对象,参数表明是哪种着色器,一般着色器有六种
    glShaderSource(vertex_shader, 1, vertex_shader_source, NULL); //将着色器源代码传递给着色器对象,以便保留该源代码的副本
    glCompileShader(vertex_shader);//对着色器对象中包含的任何源代码进行编译
    
    GLchar* infoLog = new GLchar[1000];
    GLsizei length;
    glGetShaderInfoLog(vertex_shader, 1000, &length, infoLog);
    
    fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
    glCompileShader(fragment_shader);
    
    program = glCreateProgram(); //创建一个程序对象,我们可以将着色器对象附加到该对象
    glAttachShader(program, vertex_shader); //将顶点着色器对象附加到该程序对象中
    glAttachShader(program, fragment_shader); //将片元着色器对象附加到该程序对象中
    glLinkProgram(program); //将所有附加到程序对象的着色器对象链接到一起
    
//    glDeleteShader(vertex_shader); //删除着色器对象,一旦着色器链接到一个程序对象后,程序将包含二进制代码,并不再需要着色器
//    glDeleteShader(fragment_shader);
    
    return program;
}

class my_application2 : public sb7::application
{
private:
    GLuint rendering_program;
    GLuint vertex_array_object;
    
public:
    
    void startup()
    {
        
        rendering_program = compile_shaders();
//        glCreateVertexArrays(1, &vertex_array_object); //这个会报错,不知道为啥,应该和部署版本有关
        glGenVertexArrays(1, &vertex_array_object);//创建顶点数组对象
        glBindVertexArray(vertex_array_object);//绑定顶点数组对象
    }
    
    void shutdown()
    {
        glDeleteVertexArrays(1, &vertex_array_object);
        glDeleteProgram(rendering_program);//删除程序对象
        glDeleteVertexArrays(1, &vertex_array_object);//删除顶点数组对象
    }
    
    void render(double currentTime)
    {
//        const GLfloat color[] = {
//            (float)sin(currentTime) * 0.5f + 0.5f,
//            (float)cos(currentTime) * 0.5f + 0.5f,
//            0.0f, 1.0f
//        };
        const GLfloat color[] = {0.0f, 0.0f, 0.0f, 1.0f};
        glClearBufferfv(GL_COLOR, 0, color);
//        glPointSize(40.0f);
        glUseProgram(rendering_program); //设置OpenGL使用程序对象进行渲染
        
//        glDrawArrays(GL_POINTS, 0, 1);//绘制命令
        glDrawArrays(GL_TRIANGLES, 0, 3);//绘制命令
    }
};

DECLARE_MAIN(my_application2);

下面是运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值