Вершинный шейдер OpenGL Mac OSX не связан с фрагментным шейдером

У меня проблемы с компиляцией и выполнением простого приложения OpenGL в Mac OSX 10.9. В винде работает нормально. Но в Mac я продолжаю получать некоторые ошибки при связывании вершинного шейдера с фрагментным шейдером в программе шейдеров.

Вот мой консольный вывод.

4.1 INTEL-8.26.34

ERROR! could not link the shader program
WARNING: Output of vertex shader 'outColor' not read by fragment shader
ERROR: Input of fragment shader 'inColor' not written by vertex shader
Program ended with exit code: 0

Вот метод, который я использую, чтобы связать оба вместе.

GLuint createShaderProgram(GLuint vertexShader, GLuint fragmentShader)
{
    // Create and link the shader program
    GLuint shaderProgram = glCreateProgram(); // create handle
    if (!shaderProgram) {
    ERROR("could not create the shader program", false);
    return NULL_HANDLE;
    }
    glAttachShader(shaderProgram, vertexShader);    // attach vertex shader
    glAttachShader(shaderProgram, fragmentShader);  // attach fragment shader
    glLinkProgram(shaderProgram);



    // check to see if the linking was successful
    int linked;
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &linked); // get link status
    if (!linked) {
        ERROR("could not link the shader program", false);
        int maxLength;
        int length;
        glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &maxLength);
        char* log = new char[maxLength];
        glGetProgramInfoLog(shaderProgram, maxLength,&length,log);
        printf(log);

        return NULL_HANDLE;
    }

    return shaderProgram;
}

Вот мой вершинный шейдер.

#version 410 core
layout (location = 0) in vec3 inPosition;
layout (location = 3) in vec3 inColor;
layout (location = 3) smooth out vec4 outColor;
void main()
{   
    gl_Position = vec4(inPosition, 1.0);
    outColor = vec4(inColor, 1.0);
}

Вот фрагшейдер

#version 410 core
layout (location = 3) smooth in vec4 inColor;
layout (location = 0) out vec4 outColor;
void main()
{
    outColor = inColor;
}

Спасибо!!


person Marcus Gabilheri    schedule 17.06.2014    source источник
comment
Похоже, это ошибка компилятора Apple GLSL. Он неправильно понимает семантику отдельных объектов шейдера для сопоставления атрибутов по их расположению индекса при связывании шейдера GLSL 4.10. Хотя ответ ratchetfreak решит вашу проблему, он технически неверен. Имена не обязательно должны совпадать (или, по крайней мере, если бы компилятор/компоновщик выполнял свою работу, они бы не совпадали), это проблема со стороны Apple. Вы можете подсказать драйверу, чтобы он работал так, как он должен, если вы добавите #extension GL_ARB_separate_shader_objects : enable в начало шейдера.   -  person Andon M. Coleman    schedule 17.06.2014
comment
Еще одна вещь, которую следует учитывать: если вы хотите, чтобы отдельные объекты шейдера работали, вы должны повторно объявить gl_PerVertex. Так что попробуйте также добавить out gl_PerVertex { vec4 gl_Position; };. Если даже это не исправит, то в этом можно обвинить Apple.   -  person Andon M. Coleman    schedule 17.06.2014


Ответы (1)


имена должны совпадать:

чтобы имя вывода вершинного шейдера совпадало с именем ввода фрагментного шейдера:

#version 410 core
layout (location = 0) in vec3 inPosition;
layout (location = 3) in vec3 inColor;
smooth out vec4 vertOutColor;
void main()
{   
    gl_Position = vec4(inPosition, 1.0);
    vertOutColor = vec4(inColor, 1.0);
}

фрагментный шейдер:

#version 410 core
smooth in vec4 vertOutColor;
layout (location = 0) out vec4 outColor;
void main()
{
    outColor = vertOutColor;
}
person ratchet freak    schedule 17.06.2014
comment
Нет, это использование отдельных объектов шейдера. Имена вообще не при чем. Это места, которые должны совпадать. См. Раздел 4.3.8.1 здесь. Насколько я могу судить, это ошибка компилятора GLSL. Явное сопоставление местоположения для входных/выходных данных этапа является основным в GLSL 4.10. - person Andon M. Coleman; 17.06.2014
comment
Только что попробовал, и теперь я получаю разные ошибки. ERROR! Could not compile shader 'vertexShader1.vert' ERROR! Could not compile shader 'fragmentShader1.frag' Program ended with exit code: 0 - person Marcus Gabilheri; 17.06.2014
comment
@MarcusGabilheri Я забыл переименовать переменные в коде - person ratchet freak; 17.06.2014