Я не был в 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 программы не определена
Хорошо, возможно, это может решить! Теперь фрагмент не компилируется из-за «неопределенной точности по переменной float» строки 125, но шейдер короче 125 строк ... можете ли вы объяснить, какой поплавок является ошибкой? – nyarlathotep108
@ nyarlathotep108 Если вы используете OpenGL ES, вам нужно указать точность поплавка. Добавьте что-то вроде этого: «precision mediump float;» в верхней части вашего шейдера фрагмента. Проверьте это: http://stackoverflow.com/questions/13780609/what-does-precision-mediump-float-mean – Reigertje