Advertisement
AniCator

Clipboard

Nov 29th, 2015
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. static const char* ExtensionVertexShader = "vert";
  2. static const char* ExtensionFragmentShader = "frag";
  3. GLuint LoadShaderFromFile( const char* FileLocation, GLuint ShaderType )
  4. {
  5. std::stringstream FileLocationWithExtension;
  6. const char* FileExtension = nullptr;
  7.  
  8. FileLocationWithExtension << "shaders/" << FileLocation;
  9.  
  10. if( ShaderType == GL_VERTEX_SHADER )
  11. {
  12. FileExtension = ExtensionVertexShader;
  13. }
  14. else if( ShaderType == GL_FRAGMENT_SHADER )
  15. {
  16. FileExtension = ExtensionFragmentShader;
  17. }
  18. else
  19. {
  20. std::cout << "Shader type not supported. Shader file won't be loaded." << std::endl;
  21. return 0;
  22. }
  23.  
  24. if( FileExtension != nullptr )
  25. {
  26. FileLocationWithExtension << "." << FileExtension;
  27. }
  28.  
  29. std::cout << "Loading shader \"" << FileLocationWithExtension.str() << "\"" << std::endl;
  30.  
  31. GLuint ShaderHandle = 0;
  32. const char *ShaderData = ReadTextFile( FileLocationWithExtension.str().c_str() );
  33.  
  34. if( ShaderData != nullptr )
  35. {
  36. ShaderHandle = glCreateShader( ShaderType );
  37. glShaderSource( ShaderHandle, 1, &ShaderData, NULL );
  38. free( (void*) ShaderData );
  39. }
  40. else
  41. {
  42. std::cout << "File not found \"" << FileLocationWithExtension.str() << "\"" << std::endl;
  43. }
  44.  
  45. return ShaderHandle;
  46. }
  47.  
  48. GLuint CreateShaderProgram( GLuint VertexShaderHandle, GLuint FragmentShaderHandle )
  49. {
  50. if( VertexShaderHandle == 0 || FragmentShaderHandle == 0 )
  51. {
  52. if( VertexShaderHandle == 0 )
  53. {
  54. std::cout << "Vertex shader handle is invalid" << std::endl;
  55. }
  56.  
  57. if( FragmentShaderHandle == 0 )
  58. {
  59. std::cout << "Fragment shader handle is invalid" << std::endl;
  60. }
  61.  
  62. return 0;
  63. }
  64.  
  65. // Compile all shaders
  66. glCompileShader( VertexShaderHandle );
  67. LogShaderCompilationErrors( VertexShaderHandle );
  68. glCompileShader( FragmentShaderHandle );
  69. LogShaderCompilationErrors( FragmentShaderHandle );
  70.  
  71. // Create the program
  72. GLuint ProgramHandle = glCreateProgram();
  73.  
  74. // Attach shaders to program
  75. glAttachShader( ProgramHandle, VertexShaderHandle );
  76. glAttachShader( ProgramHandle, FragmentShaderHandle );
  77.  
  78. // Link and set program to use
  79. glLinkProgram( ProgramHandle );
  80.  
  81. GLint LinkStatus;
  82. glGetProgramiv( ProgramHandle, GL_LINK_STATUS, &LinkStatus );
  83.  
  84. glDeleteShader( VertexShaderHandle );
  85. glDeleteShader( FragmentShaderHandle );
  86.  
  87. if( LinkStatus == GL_FALSE )
  88. {
  89. std::cout << "Shader program compilation failed" << std::endl;
  90. return 0;
  91. }
  92.  
  93. return ProgramHandle;
  94. }
  95.  
  96. GLuint LoadShaderProgram( const char* VertexFileLocation, const char* FragmentFileLocation )
  97. {
  98. std::cout << "Loading shader program \"" << VertexFileLocation << "\" with fragment shader \"" << FragmentFileLocation << "\"" << std::endl;
  99. GLuint VertexShaderHandle, FragmentShaderHandle;
  100.  
  101. // Read source code from files
  102. VertexShaderHandle = LoadShaderFromFile( VertexFileLocation, GL_VERTEX_SHADER );
  103. FragmentShaderHandle = LoadShaderFromFile( FragmentFileLocation, GL_FRAGMENT_SHADER );
  104.  
  105. return CreateShaderProgram( VertexShaderHandle, FragmentShaderHandle );
  106. }
  107.  
  108. GLuint LoadShaderProgram( const char* FileLocation )
  109. {
  110. std::cout << "Loading shader program \"" << FileLocation << "\"" << std::endl;
  111. GLuint VertexShaderHandle, FragmentShaderHandle;
  112.  
  113. // Read source code from files
  114. VertexShaderHandle = LoadShaderFromFile( FileLocation, GL_VERTEX_SHADER );
  115. FragmentShaderHandle = LoadShaderFromFile( FileLocation, GL_FRAGMENT_SHADER );
  116.  
  117. return CreateShaderProgram( VertexShaderHandle, FragmentShaderHandle );
  118. }
  119.  
  120. void LoadShaders()
  121. {
  122. ShaderProgramScreenGlow = LoadShaderProgram( "screen_aligned_quad", "screen_glow_slow" );
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement