Шейдеры GLSL компилируются, но программа не связывается

Я не был в OpenGL в течение длительного времени, и никогда не использовал OpenGLES совсем.
Для моего проекта я должен использовать OpenGLES, версия напечатана glGetString(GL_VERSION) является 3.0, но так как я делаю коллаж из учебников, вполне возможно, что я смешиваю код, который не может работать в этой версии (вот почему #version тег комментируется кодом шейдеров, но все равно не решает проблему).

Это код вершинный шейдер:

        const GLchar * vertex_shader_source =
//                "#version 100\n                                                             "//                "                                                                           "" attribute vec2 a_TexCoordinate; /* Per-vertex texture coordinate */       ""                                 /* information we will pass in.  */       "" attribute vec2 coord2d;                                                   ""                                                                           ""                                                                           "" varying vec2 v_TexCoordinate;   // This will be passed into the fragment  ""                                                                           "" void main(){                                                              ""                                                                           ""       gl_Position = vec4(coord2d, 0.0, 1.0);                              ""                                                                           ""     // Pass through the texture coordinate.                               ""        v_TexCoordinate = a_TexCoordinate;                                 "" }                                                                         ";

glShaderSource(vertex_shader_index, 1, &vertex_shader_source, nullptr);
glCompileShader(vertex_shader_index);
glGetShaderiv(vertex_shader_index, GL_COMPILE_STATUS, &compile_ok);

И это код фрагментный шейдер:

        const GLchar * fragment_shader_source =
//                "#version 100\n                                                     "//                "                                                                   ""uniform sampler2D u_Texture;    // The input texture.              ""                                                                   ""varying vec2 v_TexCoordinate; /* Interpolated texture    */        ""                              /* coordinate per fragment */        ""                                                                   "" void main(){                                                      ""                                                                   ""     // Output color = color of the texture at the specified UV    ""     gl_FragColor = texture2D(u_Texture, v_TexCoordinate);         "" }                                                                 ";

glShaderSource(fragment_shader_index, 1, &fragment_shader_source, nullptr);
glCompileShader(fragment_shader_index);
glGetShaderiv(fragment_shader_index, GL_COMPILE_STATUS, &compile_ok);

Это код программы:

m_program = glCreateProgram( );
glAttachShader(m_program, vertex_shader_index);
glAttachShader(m_program, fragment_shader_index);
glLinkProgram(m_program);
glGetProgramiv(m_program, GL_LINK_STATUS, &link_ok);

Переменная link_ok является ложный, в то время как переменные compile_ok оба правда. Расширенная ошибка при связывании программы говорит:

(0) Информация о вершине: C3001 программа не определена
(0) Информация о фрагменте: C3001 программа не определена

0

Решение

Ваши индивидуальные шейдеры компилируются просто отлично. Конкретный код ошибки, который вы получаете, означает, что никакие основные функции не могут быть найдены в полной программе.
И не зря — вы их прокомментировали. Строки вашего шейдера не содержат никаких новых строк, поэтому весь шейдер находится на одной строке.

Например:

const GLchar * var = "uniform value; // a value""main () {}               ";

На самом деле

const GLchar * var = "uniform value; // a valuemain() {}";

Любое комментирование, выполненное с помощью //, комментирует остальную часть строки — отсюда и остальную часть вашего шейдера. Удаление комментариев //, замена их на / ** / или добавление \ n в конце каждой строки, и у меня это работало нормально.

Кроме того, может быть безопасным завершить строки строкой \ 0.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]