2015-12-15 5 views
0

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

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

 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 равна false, тогда как переменные compile_ok оба являются true. Расширенная ошибка от компоновки программы гласит:

(0) Vertex информации: C3001 программы не определена (0) Fragment информации: C3001 программы не определена

ответ

4

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

Например:

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

Это на самом деле

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

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

Кроме того, может быть безопасно обнулить нулевые строки с помощью \ 0.

+0

Хорошо, возможно, это может решить! Теперь фрагмент не компилируется из-за «неопределенной точности по переменной float» строки 125, но шейдер короче 125 строк ... можете ли вы объяснить, какой поплавок является ошибкой? – nyarlathotep108

+2

@ nyarlathotep108 Если вы используете OpenGL ES, вам нужно указать точность поплавка. Добавьте что-то вроде этого: «precision mediump float;» в верхней части вашего шейдера фрагмента. Проверьте это: http://stackoverflow.com/questions/13780609/what-does-precision-mediump-float-mean – Reigertje