Я не был в 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 программа не определена
Ваши индивидуальные шейдеры компилируются просто отлично. Конкретный код ошибки, который вы получаете, означает, что никакие основные функции не могут быть найдены в полной программе.
И не зря — вы их прокомментировали. Строки вашего шейдера не содержат никаких новых строк, поэтому весь шейдер находится на одной строке.
Например:
const GLchar * var = "uniform value; // a value""main () {} ";
На самом деле
const GLchar * var = "uniform value; // a valuemain() {}";
Любое комментирование, выполненное с помощью //, комментирует остальную часть строки — отсюда и остальную часть вашего шейдера. Удаление комментариев //, замена их на / ** / или добавление \ n в конце каждой строки, и у меня это работало нормально.
Кроме того, может быть безопасным завершить строки строкой \ 0.
Других решений пока нет …