void djvOpenGlImageShader::init( const QString & vertex, const QString & fragment) throw (djvError) { if (vertex == _vertex && fragment == _fragment) return; //DJV_DEBUG("djvOpenGlImageShader::init"); //DJV_DEBUG_PRINT("fragment = " << fragment); del(); _vertex = vertex; _fragment = fragment; GLint error = GL_FALSE; _vertexId = shaderCreate(GL_VERTEX_SHADER); _fragmentId = shaderCreate(GL_FRAGMENT_SHADER); shaderCompile(_vertexId, _vertex); shaderCompile(_fragmentId, _fragment); DJV_DEBUG_OPEN_GL(_program = glCreateProgram()); if (! _program) { throw djvError( "djvOpenGlImageShader", djvOpenGlImage::errorLabels()[djvOpenGlImage::ERROR_CREATE_PROGRAM]); } DJV_DEBUG_OPEN_GL(glAttachShader(_program, _vertexId)); DJV_DEBUG_OPEN_GL(glAttachShader(_program, _fragmentId)); DJV_DEBUG_OPEN_GL(glLinkProgram (_program)); glGetProgramiv(_program, GL_LINK_STATUS, &error); char log [4096] = ""; GLsizei logSize = 0; glGetProgramInfoLog(_program, 4096, &logSize, log); //DJV_DEBUG_PRINT("log = " << QString(log)); if (error != GL_TRUE) { throw djvError( "djvOpenGlImageShader", djvOpenGlImage::errorLabels()[djvOpenGlImage::ERROR_CREATE_PROGRAM]. arg(log)); } }
GLuint shaderLoadAndCompile( ShaderSource *s ) { GLuint shader = 0; GLchar *text = loadText( s->fname ); if( text ) { shader = shaderCompile( s->type, s->fname, text ); free( text ); } return shader; }