【问题标题】:OpenGL GLSL shaders on Mac does not compileMac 上的 OpenGL GLSL 着色器无法编译
【发布时间】:2015-10-26 12:55:55
【问题描述】:

当我尝试在 Mac 上为我的应用程序编译 GLSL 着色器时,它会因为着色器的版本冲突错误而失败:

Error compiling vertex shader:
ERROR: 0:1: '' :  version '130' is not supported

Error compiling shader:
ERROR: 0:1: '' :  version '130' is not supported

着色器是这样的:

顶点着色器:

#version 130

in vec2 in_vPos;
in vec2 in_vTexCoord;

out vec2 s_vTexCoord;

void main()
{
    gl_Position = vec4(in_vPos, 0, 1);
    s_vTexCoord = (in_vTexCoord + vec2(1, 1)) / 2;
}

片段着色器:

#version 130

in vec2 s_vTexCoord;

out vec4 s_colOut;

uniform sampler2DRect s_texSampler;
uniform vec4 s_colBlend;

void main()
{
    vec4 pixel = texture(s_texSampler, s_vTexCoord * textureSize(s_texSampler));
    s_colOut = s_colBlend * pixel;
}

这就是我初始化我的 SDL 渲染器和 Glew 的方式:

  ren_pRenderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

  SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
  SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
  glEnable(GL_MULTISAMPLE);

  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE | SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG);

  SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "1");

  static bool _bInitializedGlew = false;
  if(!_bInitializedGlew) {
    glewExperimental = GL_TRUE;
    GLenum err = glewInit();
    if(err != GLEW_OK) {
      printf("Glew initialization error: %d\n", err);
    }
    _bInitializedGlew = true;
  }

这就是我编译着色器的方式:

unsigned int CShader::CompileShader(const char* str, int type, bool &bSuccess)
{
    // create a new shader
    GLuint iShader = glCreateShader(type);
    const GLchar* aSourceVertex[] = { str };
    glShaderSource(iShader, 1, aSourceVertex, NULL);
    glCompileShader(iShader);

    // check if compiling went okay
    GLint bShaderCompiled = GL_FALSE;
    glGetShaderiv(iShader, GL_COMPILE_STATUS, &bShaderCompiled);
    if(bShaderCompiled != GL_TRUE) {
        // it did not.
        printf("Error compiling %sshader:\n", (type == GL_VERTEX_SHADER ? "vertex " : ""));
        int iLogLength = 0;
        int iMaxLength = 0;
        glGetShaderiv(iShader, GL_INFO_LOG_LENGTH, &iMaxLength);
        char* buffer = new char[iMaxLength];
        glGetShaderInfoLog(iShader, iMaxLength, &iLogLength, buffer);
        if(iLogLength > 0) {
            printf("%s\n", buffer);
        }
        delete[] buffer;

        // report it back
        bSuccess = false;
        // and delete the shader
        glDeleteShader(iShader);
    } else {
        // it worked!
        bSuccess = true;
    }

    // return shader
    return iShader;
}

我之前四处寻找答案,但找不到可以帮助我的结论性 Stackoverflow 答案,尽管它确实为我指明了正确的方向,SDL_GL_SetAttribute 用于设置 GL 版本和核心配置文件。所以在上面的代码中,我将它设置为 3.1 Core,according to Wikipedia 是 #version 140,但即使我使用它,我也会得到同样的错误:

Error compiling vertex shader:
ERROR: 0:1: '' :  version '140' is not supported

Error compiling shader:
ERROR: 0:1: '' :  version '140' is not supported

编辑:我将属性中的版本更改为 3.2 Core + Forward Compat,现在使用 #version 150 我遇到了同样的问题,说不支持 150。

当我打印glGetString(GL_SHADING_LANGUAGE_VERSION) 的结果时,我得到1.20。

即使我在创建 SDL 窗口后显式创建上下文,它仍然会报告 1.20:

win_pWindow = SDL_CreateWindow(strTitle, iX, iY, width, height, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | ulFlags);
win_pContext = SDL_GL_CreateContext(win_pWindow);
printf("GLSL version: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));

【问题讨论】:

    标签: c++ macos opengl glsl glew


    【解决方案1】:

    嗯,那个错误信息怎么样:

    Error compiling vertex shader:
    ERROR: 0:1: '' :  version '130' is not supported
    

    这正是您的问题所在。 GLSL 1.30 版与 OpenGL-3.0 相关;由于该版本中没有核心/兼容性配置文件,但 MacOS X 不支持它。

    现代 OpenGL MacOS X 仅支持 core 配置文件。因此,您需要一个核心配置文件上下文,并且必须使用核心配置文件版本编写您的着色器。 OpenGL-3 核心配置文件仅在 OpenGL-3.2 中引入,对应的 GLSL 版本为 1.50。所以你必须在那里写#version 150。

    【讨论】:

    • 作为一个小注解:由于某种原因,迄今为止所有核心配置文件版本都需要支持 GLSL 回到 1.40,因此将其添加到 #version 140 就足够了。
    【解决方案2】:

    你没有创建你认为你正在创建的上下文版本:

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE | SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG)
    

    只是无效,SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG 不属于SDL_GL_CONTEXT_PROFILE_MASK 标志,而是属于SDL_GL_CONTEXT_FLAGS。

    实际上,SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG 与 SDL_GL_CONTEXT_PROFILE_COMPATIBILITY 具有相同的值,因此您确实同时请求了核心和兼容性配置文件。我怀疑你有一个遗留上下文,它仅限于 OSX 上的 GL

    【讨论】:

      【解决方案3】:
      • 我听说使用 SDL_Renderer 会降低 OpenGL 版本的兼容性配置文件/不使用核心配置文件的 OpenGL 版本(因此,低于 3.2 的 OpenGL 版本)
      • 确保在使用SDL_GLSetAttribute 设置版本等之后同时设置窗口和上下文。所以你的代码应该是这样的:

        SDL_GLSetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
        SDL_GLSetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
        SDL_GLSetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
        
        //create window
        
        //create context
        

      这就是我设法在我的 mac 上获得 3.3 上下文的方法。从您的代码中,我看不到您是否在属性之后创建了上下文和窗口。

      【讨论】:

      • 虽然 OP 不应该尝试互操作 SDL_Renderer 和 OpenGL。 API 中没有规定保存/恢复 SDL_Renderer 状态,如果它甚至使用 OpenGL 后端的话。
      【解决方案4】:

      我还是 OpenGL 和 GLFW 的新手,我不确定是什么问题,但是在 macOS 上遇到了同样的问题,但是将以下代码块放在这个位置可以解决问题。

      glfwInit();
      
      glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
      glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
      glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
      #ifdef __APPLE__
       glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
      #endif
      
      GLFWwindow *window = glfwCreateWindow( ... );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多