在Mac上编译OpenGL GLSL着色器失败

5

当我在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,根据维基百科所述,是#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));
4个回答

3

嗯,那个错误消息怎么办:

Error compiling vertex shader:
ERROR: 0:1: '' :  version '130' is not supported
这正是你的问题所在。GLSL 1.30 版本与 OpenGL-3.0 相关联;由于该版本还没有核心/兼容性配置文件,因此 MacOS X 不支持它。
当涉及到现代 OpenGL 时,MacOS X 只支持核心配置文件。因此,你需要一个核心配置文件上下文,并使用核心配置文件版本编写着色器。OpenGL-3 核心配置文件仅在OpenGL-3.2中引入,相应的 GLSL 版本为1.50。因此您必须在那里编写 `#version 150`。

作为一个小的侧面说明:迄今为止,所有核心配置文件版本都需要支持GLSL回到1.40,因此将其提升到“#version 140”就足够了。 - derhass

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_FLAGSDL_GL_CONTEXT_PROFILE_COMPATIBILITY具有相同的值,因此您同时请求了核心和兼容性配置文件。我怀疑您得到了一个旧版的上下文,它在OSX上限制为GL <= 2.1。


2
  • I have heard that using SDL_Renderer bumps down the OpenGL version to a compatibility profile/a version of OpenGL that doesn't use core profile (so, a OpenGL version less than 3.2)
  • Make sure you make both the window and context after setting the version etc with SDL_GLSetAttribute. So your code should look like:

    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上下文的方法。从您的代码中,我无法看出您是否在属性之后创建了上下文和窗口。

1
但是,实际上,OP不应该尝试在SDL_Renderer和OpenGL之间进行互操作。如果它甚至使用OpenGL后端,API中没有保存/恢复SDL_Renderer状态的规定。 - genpfault

0

我对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( ... );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接