Advertisement
Guest User

LoadShaders

a guest
Jun 4th, 2013
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.57 KB | None | 0 0
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  --- LoadShaders.h ---
  4. //
  5. //////////////////////////////////////////////////////////////////////////////
  6.  
  7. #ifndef __LOAD_SHADERS_H__
  8. #define __LOAD_SHADERS_H__
  9.  
  10. #ifdef __cplusplus
  11. extern "C" {
  12. #endif  // __cplusplus
  13.  
  14. //----------------------------------------------------------------------------
  15. //
  16. //  LoadShaders() takes an array of ShaderFile structures, each of which
  17. //    contains the type of the shader, and a pointer a C-style character
  18. //    string (i.e., a NULL-terminated array of characters) containing the
  19. //    entire shader source.
  20. //
  21. //  The array of structures is terminated by a final Shader with the
  22. //    "type" field set to GL_NONE.
  23. //
  24. //  LoadShaders() returns the shader program value (as returned by
  25. //    glCreateProgram()) on success, or zero on failure.
  26. //
  27.  
  28. typedef struct {
  29.     GLenum       type;
  30.     const char*  filename;
  31.     GLuint       shader;
  32. } ShaderInfo;
  33.  
  34. GLuint LoadShaders( ShaderInfo* );
  35.  
  36. //----------------------------------------------------------------------------
  37.  
  38. #ifdef __cplusplus
  39. };
  40. #endif // __cplusplus
  41.  
  42. #endif // __LOAD_SHADERS_H__
  43.  
  44.  
  45.  
  46. //////////////////////////////////////////////////////////////////////////////
  47. //
  48. //  --- LoadShaders.cxx ---
  49. //
  50. //////////////////////////////////////////////////////////////////////////////
  51.  
  52. #include <cstdlib>
  53. #include <iostream>
  54.  
  55. #define GLEW_STATIC
  56. #include <GL/glew.h>
  57. #include "LoadShaders.h"
  58.  
  59. #ifdef __cplusplus
  60. extern "C" {
  61. #endif // __cplusplus
  62.  
  63. //----------------------------------------------------------------------------
  64.  
  65. static const GLchar*
  66. ReadShader( const char* filename )
  67. {
  68. #ifdef WIN32
  69.     FILE* infile;
  70.     fopen_s( &infile, filename, "rb" );
  71. #else
  72.     FILE* infile = fopen( filename, "rb" );
  73. #endif // WIN32
  74.  
  75.     if ( !infile ) {
  76. #ifdef _DEBUG
  77.         std::cerr << "Unable to open file '" << filename << "'" << std::endl;
  78. #endif /* DEBUG */
  79.         return NULL;
  80.     }
  81.  
  82.     fseek( infile, 0, SEEK_END );
  83.     long len = ftell( infile );
  84.     fseek( infile, 0, SEEK_SET );
  85.  
  86.     GLchar* source = new GLchar[len+1];
  87.  
  88.     fread( source, 1, len, infile );
  89.     fclose( infile );
  90.  
  91.     source[len] = 0;
  92.  
  93.     return const_cast<const GLchar*>(source);
  94. }
  95.  
  96. //----------------------------------------------------------------------------
  97.  
  98. GLuint
  99. LoadShaders( ShaderInfo* shaders )
  100. {
  101.     if ( shaders == NULL ) { return 0; }
  102.  
  103.     GLuint program = glCreateProgram();
  104.  
  105.     ShaderInfo* entry = shaders;
  106.     while ( entry->type != GL_NONE ) {
  107.         GLuint shader = glCreateShader( entry->type );
  108.  
  109.         entry->shader = shader;
  110.  
  111.         const GLchar* source = ReadShader( entry->filename );
  112.         if ( source == NULL ) {
  113.             for ( entry = shaders; entry->type != GL_NONE; ++entry ) {
  114.                 glDeleteShader( entry->shader );
  115.                 entry->shader = 0;
  116.             }
  117.  
  118.             return 0;
  119.         }
  120.  
  121.         glShaderSource( shader, 1, &source, NULL );
  122.         delete [] source;
  123.  
  124.         glCompileShader( shader );
  125.  
  126.         GLint compiled;
  127.         glGetShaderiv( shader, GL_COMPILE_STATUS, &compiled );
  128.         if ( !compiled ) {
  129. #ifdef _DEBUG
  130.             GLsizei len;
  131.             glGetShaderiv( shader, GL_INFO_LOG_LENGTH, &len );
  132.  
  133.             GLchar* log = new GLchar[len+1];
  134.             glGetShaderInfoLog( shader, len, &len, log );
  135.             std::cerr << "Shader compilation failed: " << log << std::endl;
  136.             delete [] log;
  137. #endif /* DEBUG */
  138.  
  139.             return 0;
  140.         }
  141.  
  142.         glAttachShader( program, shader );
  143.        
  144.         ++entry;
  145.     }
  146.  
  147. #ifdef GL_VERSION_4_1
  148.     if ( GLEW_VERSION_4_1 ) {
  149.         // glProgramParameteri( program, GL_PROGRAM_SEPARABLE, GL_TRUE );
  150.     }
  151. #endif /* GL_VERSION_4_1 */
  152.    
  153.     glLinkProgram( program );
  154.  
  155.     GLint linked;
  156.     glGetProgramiv( program, GL_LINK_STATUS, &linked );
  157.     if ( !linked ) {
  158. #ifdef _DEBUG
  159.         GLsizei len;
  160.         glGetProgramiv( program, GL_INFO_LOG_LENGTH, &len );
  161.  
  162.         GLchar* log = new GLchar[len+1];
  163.         glGetProgramInfoLog( program, len, &len, log );
  164.         std::cerr << "Shader linking failed: " << log << std::endl;
  165.         delete [] log;
  166. #endif /* DEBUG */
  167.  
  168.         for ( entry = shaders; entry->type != GL_NONE; ++entry ) {
  169.             glDeleteShader( entry->shader );
  170.             entry->shader = 0;
  171.         }
  172.        
  173.         return 0;
  174.     }
  175.  
  176.     return program;
  177. }
  178.  
  179. //----------------------------------------------------------------------------
  180. #ifdef __cplusplus
  181. }
  182. #endif // __cplusplus
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement