LoadShader.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "LoadShader.h"
  2. #include "OpenGLInclude.h"
  3. #include <assert.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. // Load the shader from the source text
  7. void gltLoadShaderSrc(const char *szShaderSrc, GLuint shader)
  8. {
  9. GLchar *fsStringPtr[1];
  10. fsStringPtr[0] = (GLchar *)szShaderSrc;
  11. glShaderSource(shader, 1, (const GLchar **)fsStringPtr, NULL);
  12. }
  13. GLuint gltLoadShaderPair(const char *szVertexProg, const char *szFragmentProg)
  14. {
  15. assert(glGetError()==GL_NO_ERROR);
  16. // Temporary Shader objects
  17. GLuint hVertexShader;
  18. GLuint hFragmentShader;
  19. GLuint hReturn = 0;
  20. GLint testVal;
  21. // Create shader objects
  22. hVertexShader = glCreateShader(GL_VERTEX_SHADER);
  23. hFragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
  24. gltLoadShaderSrc(szVertexProg, hVertexShader);
  25. gltLoadShaderSrc(szFragmentProg, hFragmentShader);
  26. // Compile them
  27. glCompileShader(hVertexShader);
  28. assert(glGetError()==GL_NO_ERROR);
  29. glGetShaderiv(hVertexShader, GL_COMPILE_STATUS, &testVal);
  30. if(testVal == GL_FALSE)
  31. {
  32. char temp[256] = "";
  33. glGetShaderInfoLog( hVertexShader, 256, NULL, temp);
  34. fprintf( stderr, "Compile failed:\n%s\n", temp);
  35. assert(0);
  36. return 0;
  37. glDeleteShader(hVertexShader);
  38. glDeleteShader(hFragmentShader);
  39. return (GLuint)NULL;
  40. }
  41. assert(glGetError()==GL_NO_ERROR);
  42. glCompileShader(hFragmentShader);
  43. assert(glGetError()==GL_NO_ERROR);
  44. glGetShaderiv(hFragmentShader, GL_COMPILE_STATUS, &testVal);
  45. if(testVal == GL_FALSE)
  46. {
  47. char temp[256] = "";
  48. glGetShaderInfoLog( hFragmentShader, 256, NULL, temp);
  49. fprintf( stderr, "Compile failed:\n%s\n", temp);
  50. assert(0);
  51. exit(0);
  52. glDeleteShader(hVertexShader);
  53. glDeleteShader(hFragmentShader);
  54. return (GLuint)NULL;
  55. }
  56. assert(glGetError()==GL_NO_ERROR);
  57. // Check for errors
  58. // Link them - assuming it works...
  59. hReturn = glCreateProgram();
  60. glAttachShader(hReturn, hVertexShader);
  61. glAttachShader(hReturn, hFragmentShader);
  62. glLinkProgram(hReturn);
  63. // These are no longer needed
  64. glDeleteShader(hVertexShader);
  65. glDeleteShader(hFragmentShader);
  66. // Make sure link worked too
  67. glGetProgramiv(hReturn, GL_LINK_STATUS, &testVal);
  68. if(testVal == GL_FALSE)
  69. {
  70. GLsizei maxLen = 4096;
  71. GLchar infoLog[4096];
  72. GLsizei actualLen;
  73. glGetProgramInfoLog( hReturn,
  74. maxLen,
  75. &actualLen,
  76. infoLog);
  77. printf("Warning/Error in GLSL shader:\n");
  78. printf("%s\n",infoLog);
  79. glDeleteProgram(hReturn);
  80. return (GLuint)NULL;
  81. }
  82. return hReturn;
  83. }