Пример #1
0
 void Shader::_compile() {
   if (shader != 0) return;
     
   shader = glCreateShaderObjectARB(shaderType());
   if (shader == 0) {
     throw std::runtime_error("failed to create shader object");
   }
     
   const char *_prog = prog.c_str();
   GLint length = prog.size();
     
   glShaderSourceARB(shader, 1, &_prog, &length);
   glCompileShaderARB(shader);
     
   GLint compile_status = 0;
   glGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &compile_status);
   if (compile_status == 0) {
     std::ostringstream err;
     err << "failed to compile shader:" << std::endl << glsl_log(shader) << std::endl;
       
     glDeleteObjectARB(shader);
     shader = 0;
     throw std::runtime_error(err.str());
   }
 }
Пример #2
0
  void Shader::compileFlat() {
    if (shader != 0) return;
      
    shader = glCreateShaderObjectARB(shaderType());
    if (shader == 0) {
      throw std::runtime_error("failed to create shader object");
    }
      
    std::list<std::string> all_source;
    s_tag++;
    _source(all_source);

    std::ostringstream _prog;
    std::copy(all_source.begin(), all_source.end(), std::ostream_iterator<std::string>(_prog, "\n"));
      
    GLint length = _prog.str().size();
    const char *_p = _prog.str().c_str();
    glShaderSourceARB(shader, 1, &_p, &length);
    glCompileShaderARB(shader);
      
    GLint compile_status = 0;
    glGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &compile_status);
    if (compile_status == 0) {
      std::ostringstream err;
      err << "failed to compile shader:" << std::endl << "----" << std::endl << glsl_log(shader) << std::endl << "----" << std::endl;

      glDeleteObjectARB(shader);
      shader = 0;
      throw std::runtime_error(err.str());
    }
  }
Пример #3
0
/**
 * Disable the shader.
 */
void GLShader::disable(void)
{
	switch (shaderType()) {
		case ST_GL_ARB_FRAGMENT_PROGRAM:
#ifdef ENABLE_ATI_TEXT_FRAGMENT_SHADER
		case ST_GL_ATI_TEXT_FRAGMENT_SHADER:
#endif /* ENABLE_ATI_TEXT_FRAGMENT_SHADER */
		{
			if (m_ARB_program <= 0)
				break;

#ifdef ENABLE_ATI_TEXT_FRAGMENT_SHADER
			const GLenum prgType = (shaderType() == ST_GL_ARB_FRAGMENT_PROGRAM
						? GL_FRAGMENT_PROGRAM_ARB
						: GL_TEXT_FRAGMENT_SHADER_ATI
						);
#else /* !ENABLE_ATI_TEXT_FRAGMENT_SHADER */
			const GLenum prgType = GL_FRAGMENT_PROGRAM_ARB;
#endif /* ENABLE_ATI_TEXT_FRAGMENT_SHADER */

			// Disable the shader.
			glDisable(prgType);
#ifdef ENABLE_ATI_TEXT_FRAGMENT_SHADER
			if (shaderType() == ST_GL_ATI_TEXT_FRAGMENT_SHADER) {
				// HACK: at least the Mac OS X 10.5 PPC Radeon drivers are broken and
				// without this disable the texture units while the program is still
				// running (10.4 PPC seems to work without this though).
				// Reference: http://git.mplayerhq.hu/?p=mplayer;a=blob;f=libvo/gl_common.c;hb=HEAD
				// NOTE: It doesn't seem to help any...
				glFlush();
			}
#endif /* ENABLE_ATI_TEXT_FRAGMENT_SHADER */
			break;
		}

		case ST_GL_ATI_FRAGMENT_SHADER:
			if (m_ATI_fragment_shader == 0)
				break;

			glDisable(GL_FRAGMENT_SHADER_ATI);
			break;

		default:
			break;
	}
}
Пример #4
0
/**
 * Enable the shader.
 */
void GLShader::enable(void)
{
	switch (shaderType()) {
		case ST_GL_ARB_FRAGMENT_PROGRAM:
#ifdef ENABLE_ATI_TEXT_FRAGMENT_SHADER
		case ST_GL_ATI_TEXT_FRAGMENT_SHADER:
#endif /* ENABLE_ATI_TEXT_FRAGMENT_SHADER */
		{
			if (m_ARB_program == 0)
				break;

#ifdef ENABLE_ATI_TEXT_FRAGMENT_SHADER
			const GLenum prgType = (shaderType() == ST_GL_ARB_FRAGMENT_PROGRAM
						? GL_FRAGMENT_PROGRAM_ARB
						: GL_TEXT_FRAGMENT_SHADER_ATI
						);
#else /* !ENABLE_ATI_TEXT_FRAGMENT_SHADER */
			const GLenum prgType = GL_FRAGMENT_PROGRAM_ARB;
#endif /* ENABLE_ATI_TEXT_FRAGMENT_SHADER */

			// Enable the shader.
			glEnable(prgType);
			glBindProgramARB(prgType, m_ARB_program);
			break;
		}

		case ST_GL_ATI_FRAGMENT_SHADER:
			if (m_ATI_fragment_shader == 0)
				break;

			glEnable(GL_FRAGMENT_SHADER_ATI);
			glBindFragmentShaderATI(m_ATI_fragment_shader);
			break;

		default:
			break;
	}
}
Пример #5
0
 const char* shaderTypeStr() { return shaderTypeToStr(shaderType()); }