Pastebin launched a little side project called VERYVIRAL.com, check it out ;-) Want more features on Pastebin? Sign Up, it's FREE!
Guest

Untitled

By: a guest on Aug 15th, 2012  |  syntax: C++  |  size: 4.06 KB  |  views: 16  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. bool ShaderManager::buildProgram( ShaderComponents comp )
  2. {
  3.         GLuint vertex   = glCreateShader( GL_VERTEX_SHADER );
  4.         GLuint fragment = glCreateShader( GL_FRAGMENT_SHADER );
  5.  
  6.         //----------------------------------------
  7.         // Read in from the source files and set as source
  8.  
  9.         // This is ugly. Need to remake it
  10.         {
  11.                 std::vector< std::string > v_source_str;
  12.                 std::vector< std::string > f_source_str;
  13.                 std::vector< const char* > v_source;
  14.                 std::vector< const char* > f_source;
  15.                 std::vector< GLint > v_length;
  16.                 std::vector< GLint > f_length;
  17.  
  18.                 v_source_str = readSource( comp.m_Vert );
  19.                 f_source_str = readSource( comp.m_Frag );
  20.  
  21.                 for( int i = 0; i < v_source_str.size( ); i++ )
  22.                 {
  23.                         v_source.push_back( v_source_str[ i ].c_str( ) );
  24.                         v_length.push_back( v_source_str[ i ].length( ) );
  25.                 }
  26.  
  27.                 for( int i = 0; i < f_source_str.size( ); i++ )
  28.                 {
  29.                         f_source.push_back( f_source_str[ i ].c_str( ) );
  30.                         f_length.push_back( f_source_str[ i ].length( ) );
  31.                 }
  32.  
  33.                 glShaderSource( vertex, v_source.size( ), &v_source[ 0 ], &v_length[ 0 ] );
  34.                 glShaderSource( fragment, f_source.size( ), &f_source[ 0 ], &f_length[ 0 ] );
  35.         }
  36.  
  37.         //----------------------------------------
  38.         // Compile
  39.  
  40.         glCompileShader( vertex );
  41.         glCompileShader( fragment );
  42.  
  43.         //----------------------------------------
  44.         // Error check
  45.  
  46.         GLint result;
  47.  
  48.         glGetShaderiv( vertex, GL_COMPILE_STATUS, &result );
  49.  
  50.         if( result == GL_FALSE )
  51.         {
  52.                 char info[ 512 ];
  53.                 glGetShaderInfoLog( vertex, 512, NULL, info );
  54.  
  55.                 ToolBox::Utilities::Logger::get( )->write( 'e', "Failed to compile Vertex Shader '%s' with error:\n%s", comp.m_Vert.m_Name.c_str( ), info );
  56.  
  57.                 // Lets also check for fragment error as well so we dont have to fix vertex
  58.                 // only to find a messed up fragment.
  59.                 glGetShaderiv( fragment, GL_COMPILE_STATUS, &result );
  60.  
  61.                 if( result == GL_FALSE )
  62.                 {
  63.                         // Fragment also failed to compile
  64.                         memset( info, '\0', 512 );
  65.                         glGetShaderInfoLog( vertex, 512, NULL, info );
  66.  
  67.                         ToolBox::Utilities::Logger::get( )->write( 'e', "Failed to compile Fragment Shader '%s' with error:\n%s", comp.m_Vert.m_Name.c_str( ), info );
  68.                 }
  69.  
  70.                 glDeleteShader( vertex );
  71.                 glDeleteShader( fragment );
  72.  
  73.                 return false;
  74.         }
  75.  
  76.         glGetShaderiv( fragment, GL_COMPILE_STATUS, &result );
  77.  
  78.         // Vertex was OK. How about fragment?
  79.         if( result == GL_FALSE )
  80.         {
  81.                 char info[ 512 ];
  82.                 glGetShaderInfoLog( vertex, 512, NULL, info );
  83.  
  84.                 ToolBox::Utilities::Logger::get( )->write( 'e', "Failed to compile Fragment Shader '%s' with error:\n%s", comp.m_Vert.m_Name.c_str( ), info );
  85.  
  86.                 glDeleteShader( vertex );
  87.                 glDeleteShader( fragment );
  88.  
  89.                 return false;
  90.         }
  91.  
  92.         //----------------------------------------
  93.         // Attach and Bind
  94.  
  95.         Shader shader;
  96.         shader.m_ID = comp.m_Frag.m_Name;
  97.         shader.m_Program = glCreateProgram( );
  98.  
  99.         glAttachShader( shader.m_Program, vertex );
  100.         glAttachShader( shader.m_Program, fragment );
  101.  
  102.         // We send off the final shader to another function for the potenitally
  103.         // lengthy binding process
  104.         bindAttributes( shader.m_Program, comp );
  105.  
  106.         //----------------------------------------
  107.         // Link and clean up
  108.  
  109.         glLinkProgram( shader.m_Program );
  110.         glGetProgramiv( shader.m_Program, GL_LINK_STATUS, &result );
  111.  
  112.         if( result == GL_FALSE )
  113.         {
  114.                 // Error while linking
  115.                 // Get the info log and report the error
  116.  
  117.                 GLint logSize = 0;
  118.                 glGetProgramiv( shader.m_Program, GL_INFO_LOG_LENGTH, &logSize );
  119.  
  120.                 std::stringstream stream;
  121.                 stream << "Failed to link program for shader '" << shader.m_ID << "'! ";
  122.  
  123.                 if( logSize == 0 )
  124.                         stream << "No Program Info Log available!";
  125.                 else
  126.                 {
  127.                         GLchar* log = new GLchar[ logSize ];
  128.                         GLsizei ret_size;
  129.  
  130.                         glGetProgramInfoLog( shader.m_Program, logSize, &ret_size, log );
  131.  
  132.                         stream << "\n" << log;
  133.  
  134.                         delete [] log;
  135.                 }
  136.  
  137.                 ToolBox::Utilities::Logger::get( )->write( 'e', stream.str( ).c_str( ) );
  138.  
  139.                 glDeleteShader( vertex );
  140.                 glDeleteShader( fragment );
  141.                 glDeleteProgram( shader.m_Program );
  142.                                
  143.                 return false;
  144.         }
  145.  
  146.         glDeleteShader( vertex );
  147.         glDeleteShader( fragment );
  148.  
  149.         m_Shaders.push_back( shader );
  150.  
  151.         return true;
  152. }
clone this paste RAW Paste Data