OpenGL GLSL shinders on Mac won't compile

When I try to compile GLSL shaders for my application on Mac, it crashes with a shader version conflict error:

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

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

      

Shaders as such:

Vertex shader:

#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;
}

      

Shader snippet:

#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;
}

      

This is how I initialize my SDL and Glew renderer:

  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;
  }

      

And this is how I assemble the shaders:

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;
}

      

I've searched for answers before and couldn't find a definitive Stackoverflow answer that could help me, although it did point me in the right direction with SDL_GL_SetAttribute

to set the GL version and kernel profile. So, in the above code, I installed 3.1 Core, which according to Wikipedia is equal #version 140

, but even if I use it, I get the same error:

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

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

      

Edit : I changed the version in attributes to 3.2 Core + Forward Compat and now with help #version 150

I get the same problem saying 150 is not supported.

When I print the result glGetString(GL_SHADING_LANGUAGE_VERSION)

I get 1.20

.

Even if I explicitly create the context after creating the SDL window, it still reports 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));

      

+5


source to share


4 answers


Hmm, how about this error message:

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

      



This is exactly your problem. GLSL version 1.30 refers to OpenGL-3.0; as this version did not have kernel / compatibility profiles, but macOS X does not support it.

When it comes to modern OpenGL, macOS X only supports the main profile. Thus, you need the main profile context and you must write your shaders with the main profile version. OpenGL-3 core profiles were only introduced with OpenGL-3.2, the corresponding GLSL version is 1.50. Therefore, you need to write #version 150

.

+3


source


You are not creating the version of the context that you think you are creating:

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE | SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG)

      



just invalid, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG

does not apply to flags SDL_GL_CONTEXT_PROFILE_MASK

, but in SDL_GL_CONTEXT_FLAGS

.

Actually, SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG

has the same meaning as and SDL_GL_CONTEXT_PROFILE_COMPATIBILITY

, which is why you were querying both the kernel and the compatibility profile at the same time. I suspect you have a legacy context with this that is limited to GL <= 2.1 on OSX.

+2


source


  • I have heard that the use of SDL_Renderer reduces OpenGL version compatibility to profile / OpenGL version, which does not use the basic profile (and therefore less OpenGL version 3.2)
  • Make sure both windows and context after install version etc. with help SDL_GLSetAttribute

    . Therefore, your code should look like this:

    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
    
          

This is how I managed to get context 3.3 on my mac. From your code, I can't see if you created context and window after attributes.

+2


source


I'm still new to OpenGL and GLFW, and I'm not really sure what the problem is, but I got the same problem on macOS, but a solution to the problem of placing the next block of code in that position.

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

      

0


source







All Articles