Advertisement
Guest User

Untitled

a guest
Aug 15th, 2012
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.06 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement