Поскольку шейдер не содержит никакой информации о версии, это Язык шейдеров OpenGL 1.10 Спецификация шейдер.
В GLSL 1.10 varying
переменные типа int
не допускаются и неявное приведение от int
до float
не поддерживается. В glsl 1.10 нет переменных in
и out
. Ключевое слово для переменных-переменных: varying
.
Кроме того, переменная color
не определена в фрагментном шейдере.
varying float final;
void main( void )
{
final = gl_Vertex.w;
// [...]
}
varying float final_tofrag;
void main( void )
{
if (final_tofrag < 0.0) // ?
gl_FragData[0] = vec4(final_tofrag, final_tofrag, -gl_FragCoord.z, 0.0);
else
gl_FragData[0] = vec4(final_tofrag, final_tofrag, gl_FragCoord.z, 0.0);
}
Рекомендую проверить, компиляция шейдера прошла успешно, и если программный объект успешно соединился.
Если компиляция шейдера прошла успешно, можно проверить с помощью glGetShaderiv
и параметра GL_COMPILE_STATUS
. Например:
#include <iostream>
#include <vector>
bool CompileStatus( GLuint shader )
{
GLint status = GL_TRUE;
glGetShaderiv( shader, GL_COMPILE_STATUS, &status );
if (status == GL_FALSE)
{
GLint logLen;
glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &logLen );
std::vector< char >log( logLen );
GLsizei written;
glGetShaderInfoLog( shader, logLen, &written, log.data() );
std::cout << "compile error:" << std::endl << log.data() << std::endl;
}
return status != GL_FALSE;
}
Если связывание программы прошло успешно, можно проверить с помощью glGetProgramiv
и параметра GL_LINK_STATUS
. например:
bool LinkStatus( GLuint program )
{
GLint status = GL_TRUE;
glGetProgramiv( program, GL_LINK_STATUS, &status );
if (status == GL_FALSE)
{
GLint logLen;
glGetProgramiv( program, GL_INFO_LOG_LENGTH, &logLen );
std::vector< char >log( logLen );
GLsizei written;
glGetProgramInfoLog( program, logLen, &written, log.data() );
std::cout << "link error:" << std::endl << log.data() << std::endl;
}
return status != GL_FALSE;
}