• OS X 下 OpenGL 4.x 环境配置


    配置: OS X 10.10 + CMake 3.2.2 + GLFW 3.1.1 + OpenGL 4.1 + Xcode 6.0

    本文主要介绍如何在 OS X 系统下进行环境配置,使得 Xcode 能够运行 OpenGL 4.x 的项目。

    1 安装 CMake

    在下面 GLFW 安装过程中需要用到 CMake。可以从官网(http://www.cmake.org/download/ )下载,也可 直接下载:cmake-3.2.2-Darwin-x86_64.tar.gz

    下载后解压,把应用图标放置到文件夹 /Users/apple/Applications/ 下。

    打开 /Users/apple/.bash_profile 文件,添加如下语句,将 cmake 命令文件添加到环境变量中。

    # 添加 cmake 路径
    export CMAKE_CONSOLE_ROOT=/Users/apple/Applications/CMake.app/Contents/bin/
    export PATH=$CMAKE_CONSOLE_ROOT:$PATH
    

    2 安装 GLFW

    如果没有 GLFW,Xcode 创建的项目只能运行 OpenGL 2.1 的版本,而无法使用系统支持的 4.x 版本。
    GLFW 可以从官网(http://www.glfw.org/download.html )下载,也可 直接下载:glfw-3.1.1.zip

    下载解压后将文件夹 glfw-3.1.1 放置到 /Users/apple/Library/ 中。

    2.1 修改配置信息

    打开配置文件 /Users/apple/Library/glfw-3.1.1/src/glfw_config.h.in
    将需要配置的宏均定义为 1 。

    需要配置的宏如下:

    #cmakedefine _GLFW_COCOA
    #cmakedefine _GLFW_NSGL
    cmakedefine _GLFW_USE_OPENGL
    

    修改后变为:

    #cmakedefine _GLFW_COCOA        1
    #cmakedefine _GLFW_NSGL         1
    #cmakedefine _GLFW_USE_OPENGL   1
    

    2.2 添加 OpenGL 版本配置信息

    如果此时对 GLFW 进行编译安装,会出现如下错误:

    /Users/apple/Library/glfw-3.1.1/src/nsgl_context.m:128:45: error: use of
          undeclared identifier 'NSOpenGLProfileVersion4_1Core'; did you mean
          'NSOpenGLProfileVersion3_2Core'?
            ADD_ATTR2(NSOpenGLPFAOpenGLProfile, NSOpenGLProfileVersion4_1Core);
    

    为了避免这一错误,需要更改 NSOpenGL.h 文件。

    打开文件 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/AppKit.framework/Headers/NSOpenGL.h

    找到如下枚举声明:

    /* NSOpenGLPFAOpenGLProfile values */
    enum {
        NSOpenGLProfileVersionLegacy NS_ENUM_AVAILABLE_MAC(10_7)   = 0x1000,   /* choose a Legacy/Pre-OpenGL 3.0 Implementation */
        NSOpenGLProfileVersion3_2Core NS_ENUM_AVAILABLE_MAC(10_7)  = 0x3200    /* choose an OpenGL 3.2 Core Implementation      */
    };
    

    添加一个枚举变量

    NSOpenGLProfileVersion4_1Core NS_ENUM_AVAILABLE_MAC(10_7)  = 0x4100    /* choose an OpenGL 4.1 Core Implementation      */
    

    2.3 编译安装

    好了,现在打开终端,转到该文件夹下,运行 cmake,安装。具体命令如下:

    $ cd /Users/apple/Library/glfw-3.1.1/
    $ cmake .
    $ make install
    

    成功后出现如下语句:

    Install the project...
    -- Install configuration: ""
    -- Installing: /usr/local/include/GLFW
    -- Installing: /usr/local/include/GLFW/glfw3.h
    -- Installing: /usr/local/include/GLFW/glfw3native.h
    -- Installing: /usr/local/lib/cmake/glfw/glfw3Config.cmake
    -- Installing: /usr/local/lib/cmake/glfw/glfw3ConfigVersion.cmake
    -- Installing: /usr/local/lib/cmake/glfw/glfwTargets.cmake
    -- Installing: /usr/local/lib/cmake/glfw/glfwTargets-noconfig.cmake
    -- Installing: /usr/local/lib/pkgconfig/glfw3.pc
    -- Installing: /usr/local/lib/libglfw3.a
    

    3 创建 Xcode 项目

    3.1 新建项目

    1、打开Xcode,新建OSX Command Line Tool工程

    2、左侧选中工程

    (1)在 Build Settings 里找到 Header Search Paths

    添加终端中输出的头文件路径:/usr/local/include/

    (2)在 Build Settings 里找到 Library Search Paths

    添加终端中输出的lib文件路径:/usr/local/lib/

    3、在 Build Phases中的 Link Binary With Libraries 中,添加:

    (1)IOKit.framework

    (2)Cocoa.framework

    (3)OpenGL.framework

    (4)CoreVideo.framework

    (5)libglfw3.a

    若不能找到 libglfw3.a ,可通过 Add Other... 按钮手动定位该文件,文件在 /usr/local/lib/ 中。



    3.2 三角形示例程序

    此处仅展示一个 OpenGL 4.1 的可用程序,至于 GLFW 的哪些部分使得项目能够运行高版本的 OpenGL,请参考 Xcode环境下OpenGL C++ GLFW开发环境搭建

    笔者本人并未学习 OpenGL 4.1 。本文的写作仅仅是为了解决 OS X 下运行高版本 OpenGL 的问题。因此对下面的代码执行原理不做分析。

    main.cpp 文件中添加如下代码:

    
    #define GLFW_INCLUDE_GLCOREARB // 使得GLFW包含 glfw3.h 头文件,否则为 glfw.h
    #include <GLFW/glfw3.h>
    
    #include <vector>
    #include <iostream>
    using namespace std;
    
    
    void CheckStatus( GLuint obj )
    {
        GLint status = GL_FALSE;
        if( glIsShader(obj) ) glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
        if( glIsProgram(obj) ) glGetProgramiv( obj, GL_LINK_STATUS, &status );
        if( status == GL_TRUE ) return;
        GLchar log[ 1 << 16 ] = { 0 };
        if( glIsShader(obj) ) glGetShaderInfoLog( obj, sizeof(log), NULL, log );
        if( glIsProgram(obj) ) glGetProgramInfoLog( obj, sizeof(log), NULL, log );
        std::cerr << log << std::endl;
        exit( -1 );
    }
    
    void AttachShader( GLuint program, GLenum type, const char* src )
    {
        GLuint shader = glCreateShader( type );
        glShaderSource( shader, 1, &src, NULL );
        glCompileShader( shader );
        CheckStatus( shader );
        glAttachShader( program, shader );
        glDeleteShader( shader );
    }
    
    GLuint LoadProgram( const char* vert, const char* geom, const char* frag )
    {
        GLuint prog = glCreateProgram();
        if( vert ) AttachShader( prog, GL_VERTEX_SHADER, vert );
        if( geom ) AttachShader( prog, GL_GEOMETRY_SHADER, geom );
        if( frag ) AttachShader( prog, GL_FRAGMENT_SHADER, frag );
        glLinkProgram( prog );
        CheckStatus( prog );
        return prog;
    }
    
    #define GLSL(version, shader) "#version " #version "
    " #shader
    
    
    GLuint program;
    GLuint VAO;
    void initData()
    {
        const char* vert = GLSL
        (
         410 core,
         layout( location = 0 ) in vec2 position;
         void main()
         {
             gl_Position = vec4( position, 0.0, 1.0 );
         }
         );
        
        const char* frag = GLSL
        (
         410 core,
         out vec4 FragColor;
         void main()
         {
             FragColor = vec4( 0.6, 1.0, 1.0, 1.0 );
         }
         );
        
        program = LoadProgram( vert, NULL, frag );
        
        glGenVertexArrays( 1, &VAO );
        glBindVertexArray( VAO );
        
        GLuint vertex_buffer = 0;
        glGenBuffers( 1, &vertex_buffer );
        glBindBuffer( GL_ARRAY_BUFFER, vertex_buffer );
        float data[] =
        {
            0.0f,0.8f,
            -0.8f, 0.0f,
            0.8f,0.0f
        };
        glBufferData( GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW );
        
        GLuint index_buffer = 0;
        glGenBuffers( 1, &index_buffer );
        glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, index_buffer );
        unsigned int indexes[] =
        {
            0,1,2
        };
        glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(indexes), indexes, GL_STATIC_DRAW );
        
        glEnableVertexAttribArray( 0 );
        
        glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, 0, 0 );
        
        glBindVertexArray( 0 );
    }
    
    int main( int argc, char** argv )
    {
        if( !glfwInit() )
            return -1;
        
        glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 4 );
        glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 1 );
        glfwWindowHint( GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE );
        glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE );
        
        GLFWwindow* window = glfwCreateWindow( 640, 480, "Hello window", NULL, NULL );
        if( !window )
        {
            cerr << "Error on window creating" << endl;
            glfwTerminate();
            return -1;
        }
        
        glfwMakeContextCurrent( window );
        
        cout << "GLFW version                : " << glfwGetVersionString() << endl;
        cout << "GL_VERSION                  : " << glGetString( GL_VERSION ) << endl;
        cout << "GL_VENDOR                   : " << glGetString( GL_VENDOR ) << endl;
        cout << "GL_RENDERER                 : " << glGetString( GL_RENDERER ) << endl;
        cout << "GL_SHADING_LANGUAGE_VERSION : " << glGetString( GL_SHADING_LANGUAGE_VERSION ) << endl;
        
        
        initData();
        while( !glfwWindowShouldClose(window) )
        {
            glClearColor( 0, 0, 0, 0 );
            glClear( GL_COLOR_BUFFER_BIT );
            
            glUseProgram( program );
            glBindVertexArray( VAO );
            glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0 );
            glBindVertexArray( 0 );
            
            glfwSwapBuffers( window );
            
            glfwPollEvents();
        }
        
        glfwTerminate();
        return 0;
    }
    

    运行结果:

    图片名称

    控制台输出:

    GLFW version                : 3.1.1 Cocoa NSGL chdir menubar retina
    GL_VERSION                  : 4.1 INTEL-10.2.46
    GL_VENDOR                   : Intel Inc.
    GL_RENDERER                 : Intel Iris Pro OpenGL Engine
    GL_SHADING_LANGUAGE_VERSION : 4.10
    Program ended with exit code: 0
    

    参考链接


    Xcode环境下OpenGL C++ GLFW开发环境搭建[via be2n2me] (本文总体搭建思路源于此文,感谢 be2n2me !)
    GLFW program don't draw triangle[via StackOverflow] (本文所用的代码示例源于此处,感谢贡献代码的 genpfault !)
    使用 OpenCL 和 OpenGL 图形处理器的 Mac 电脑[via Apple 官网] (各个版本的 Mac 所支持的 OpenGL 版本)

  • 相关阅读:
    word-wrap和word-break
    sass编译生成的几个文件
    block settings drupal 8 configuration
    cookie 和 session
    程序员思维
    psr-0 和 psr-4
    eclipse的字符编码问题
    合并代码并上传
    如何部署代码
    301 CACHE
  • 原文地址:https://www.cnblogs.com/tangyikejun/p/4508120.html
Copyright © 2020-2023  润新知