Advertisement
Guest User

shaderprogram

a guest
Jun 24th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.94 KB | None | 0 0
  1. /*
  2. Niniejszy program jest wolnym oprogramowaniem; mo¿esz go
  3. rozprowadzaæ dalej i / lub modyfikowaæ na warunkach Powszechnej
  4. Licencji Publicznej GNU, wydanej przez Fundacjê Wolnego
  5. Oprogramowania - wed³ug wersji 2 tej Licencji lub(wed³ug twojego
  6. wyboru) którejœ z póŸniejszych wersji.
  7.  
  8. Niniejszy program rozpowszechniany jest z nadziej¹, i¿ bêdzie on
  9. u¿yteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyœlnej
  10. gwarancji PRZYDATNOŒCI HANDLOWEJ albo PRZYDATNOŒCI DO OKREŒLONYCH
  11. ZASTOSOWAÑ.W celu uzyskania bli¿szych informacji siêgnij do
  12. Powszechnej Licencji Publicznej GNU.
  13.  
  14. Z pewnoœci¹ wraz z niniejszym programem otrzyma³eœ te¿ egzemplarz
  15. Powszechnej Licencji Publicznej GNU(GNU General Public License);
  16. jeœli nie - napisz do Free Software Foundation, Inc., 59 Temple
  17. Place, Fifth Floor, Boston, MA  02110 - 1301  USA
  18. */
  19.  
  20. #include "shaderprogram.h"
  21.  
  22.  
  23.  
  24.  
  25. //Procedura wczytuje plik do tablicy znaków.
  26. char* ShaderProgram::readFile(const char* fileName)
  27. {
  28.     int filesize;
  29.     FILE *plik;
  30.     char* result;
  31.  
  32.     plik=fopen(fileName,"rb");
  33.     fseek(plik,0,SEEK_END);
  34.     filesize=ftell(plik);
  35.     fseek(plik,0,SEEK_SET);
  36.     result=new char[filesize+1];
  37.     fread(result,1,filesize,plik);
  38.     result[filesize]=0;
  39.     fclose(plik);
  40.  
  41.     return result;
  42. }
  43.  
  44. //Metoda wczytuje i kompiluje shader, a nastêpnie zwraca jego uchwyt
  45. GLuint ShaderProgram::loadShader(GLenum shaderType,const char* fileName)
  46. {
  47.     //Wygeneruj uchwyt na shader
  48.     GLuint shader=glCreateShader(shaderType);//shaderType to GL_VERTEX_SHADER, GL_GEOMETRY_SHADER lub GL_FRAGMENT_SHADER
  49.     //Wczytaj plik ze Ÿród³em shadera do tablicy znaków
  50.     const GLchar* shaderSource=readFile(fileName);
  51.     //Powi¹¿ Ÿród³o z uchwytem shadera
  52.     glShaderSource(shader,1,&shaderSource,NULL);
  53.     //Skompiluj Ÿród³o
  54.     glCompileShader(shader);
  55.     //Usuñ Ÿród³o shadera z pamiêci (nie bêdzie ju¿ potrzebne)
  56.     delete []shaderSource;
  57.  
  58.     //Pobierz log b³êdów kompilacji i wyœwietl
  59.     int infologLength = 0;
  60.     int charsWritten  = 0;
  61.     char *infoLog;
  62.  
  63.     glGetShaderiv(shader, GL_INFO_LOG_LENGTH,&infologLength);
  64.  
  65.     if (infologLength > 1)
  66.     {
  67.         infoLog = new char[infologLength];
  68.         glGetShaderInfoLog(shader, infologLength, &charsWritten, infoLog);
  69.         printf("%s\n",infoLog);
  70.         delete []infoLog;
  71.     }
  72.  
  73.     //Zwróæ uchwyt wygenerowanego shadera
  74.     return shader;
  75. }
  76.  
  77. ShaderProgram::ShaderProgram(const char* vertexShaderFile,const char* geometryShaderFile,const char* fragmentShaderFile)
  78. {
  79.     //Wczytaj vertex shader
  80.     printf("Loading vertex shader...\n");
  81.     vertexShader=loadShader(GL_VERTEX_SHADER,vertexShaderFile);
  82.  
  83.     //Wczytaj geometry shader
  84.     if (geometryShaderFile!=NULL)
  85.     {
  86.         printf("Loading geometry shader...\n");
  87.         geometryShader=loadShader(GL_GEOMETRY_SHADER,geometryShaderFile);
  88.     }
  89.     else
  90.     {
  91.         geometryShader=0;
  92.     }
  93.  
  94.     //Wczytaj fragment shader
  95.     printf("Loading fragment shader...\n");
  96.     fragmentShader=loadShader(GL_FRAGMENT_SHADER,fragmentShaderFile);
  97.  
  98.     //Wygeneruj uchwyt programu cieniuj¹cego
  99.     shaderProgram=glCreateProgram();
  100.  
  101.     //Pod³¹cz do niego shadery i zlinkuj program
  102.     glAttachShader(shaderProgram,vertexShader);
  103.     glAttachShader(shaderRAFAŁPENISProgram,fragmentShader);
  104.     if (geometryShaderFile!=NULL)
  105.         glAttachShader(shaderProgram,geometryShader);
  106.     glLinkProgram(shaderProgram);
  107.  
  108.     //Pobierz log b³êdów linkowania i wyœwietl
  109.     int infologLength = 0;
  110.     int charsWritten  = 0;
  111.     char *infoLog;
  112.  
  113.     glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH,&infologLength);
  114.  
  115.     if (infologLength > 1)
  116.     {
  117.         infoLog = new char[infologLength];
  118.         glGetProgramInfoLog(shaderProgram, infologLength, &charsWritten, infoLog);
  119.         printf("%s\n",infoLog);
  120.         delete []infoLog;
  121.     }
  122.  
  123.     printf("Shader program created \n");
  124. }
  125.  
  126. ShaderProgram::~ShaderProgram()
  127. {
  128.     //Od³¹cz shadery od programu
  129.     glDetachShader(shaderProgram, vertexShader);
  130.     if (geometryShader!=0)
  131.         glDetachShader(shaderProgram, geometryShader);
  132.     glDetachShader(shaderProgram, fragmentShader);
  133.  
  134.     //Wykasuj shadery
  135.     glDeleteShader(vertexShader);
  136.     if (geometryShader!=0)
  137.         glDeleteShader(geometryShader);
  138.     glDeleteShader(fragmentShader);
  139.  
  140.     //Wykasuj program
  141.     glDeleteProgram(shaderProgram);
  142. }
  143.  
  144.  
  145. //W³¹cz u¿ywanie programu cieniuj¹cego reprezentowanego przez aktualny obiekt
  146. void ShaderProgram::use()
  147. {
  148.     glUseProgram(shaderProgram);
  149. }
  150.  
  151. //Pobierz numer slotu odpowiadaj¹cego zmiennej jednorodnej o nazwie variableName
  152. GLuint ShaderProgram::u(const char* variableName)
  153. {
  154.     return glGetUniformLocation(shaderProgram,variableName);
  155. }
  156.  
  157. //Pobierz numer slotu odpowiadaj¹cego atrybutowi o nazwie variableName
  158. GLuint ShaderProgram::a(const char* variableName)
  159. {
  160.     return glGetAttribLocation(shaderProgram,variableName);
  161. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement