You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

72 lines
2.7 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. #include "shader.h"
  2. #include "utils.h"
  3. #include "vertexbuffer.h"
  4. void Shader::Init(const char * vs, const char * fs)
  5. {
  6. int nFileSize = 0;
  7. const char*vsCode = (char*)LoadFileContent(vs, nFileSize);
  8. const char*fsCode = (char*)LoadFileContent(fs, nFileSize);
  9. GLuint vsShader = CompileShader(GL_VERTEX_SHADER, vsCode);
  10. if (vsShader == 0) {
  11. return;
  12. }
  13. GLuint fsShader = CompileShader(GL_FRAGMENT_SHADER, fsCode);
  14. if (fsShader == 0) {
  15. return;
  16. }
  17. mProgram = CreateProgram(vsShader, fsShader);
  18. glDeleteShader(vsShader);
  19. glDeleteShader(fsShader);
  20. if (mProgram != 0) {
  21. mModelMatrixLocation = glGetUniformLocation(mProgram, "ModelMatrix");
  22. mViewMatrixLocation = glGetUniformLocation(mProgram, "ViewMatrix");
  23. mProjectionMatrixLocation = glGetUniformLocation(mProgram, "ProjectionMatrix");
  24. mPositionLocation = glGetAttribLocation(mProgram, "position");
  25. mColorLocation = glGetAttribLocation(mProgram, "color");
  26. mTexcoordLocation = glGetAttribLocation(mProgram, "texcoord");
  27. mNormalLocation = glGetAttribLocation(mProgram, "normal");
  28. }
  29. }
  30. void Shader::Bind(float *M, float *V, float*P) {
  31. glUseProgram(mProgram);
  32. glUniformMatrix4fv(mModelMatrixLocation, 1, GL_FALSE, M);
  33. glUniformMatrix4fv(mViewMatrixLocation, 1, GL_FALSE, V);
  34. glUniformMatrix4fv(mProjectionMatrixLocation, 1, GL_FALSE, P);
  35. int iIndex = 0;
  36. for (auto iter = mUniformTextures.begin(); iter != mUniformTextures.end(); ++iter) {
  37. glActiveTexture(GL_TEXTURE0 + iIndex);
  38. glBindTexture(GL_TEXTURE_2D, iter->second->mTexture);
  39. glUniform1i(iter->second->mLocation, iIndex++);
  40. }
  41. glEnableVertexAttribArray(mPositionLocation);
  42. glVertexAttribPointer(mPositionLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
  43. glEnableVertexAttribArray(mColorLocation);
  44. glVertexAttribPointer(mColorLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float) * 4));
  45. glEnableVertexAttribArray(mTexcoordLocation);
  46. glVertexAttribPointer(mTexcoordLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float) * 8));
  47. glEnableVertexAttribArray(mNormalLocation);
  48. glVertexAttribPointer(mNormalLocation, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(sizeof(float) * 12));
  49. }
  50. void Shader::SetTexture(const char * name, const char*imagePath) {
  51. auto iter = mUniformTextures.find(name);
  52. if (iter == mUniformTextures.end()) {
  53. GLint location = glGetUniformLocation(mProgram, name);
  54. if (location != -1) {
  55. UniformTexture* t = new UniformTexture;
  56. t->mLocation = location;
  57. t->mTexture = CreateTexture2DFromBMP(imagePath);
  58. mUniformTextures.insert(std::pair<std::string, UniformTexture*>(name, t));
  59. }
  60. }
  61. else {
  62. glDeleteTextures(1, &iter->second->mTexture);
  63. iter->second->mTexture = CreateTexture2DFromBMP(imagePath);
  64. }
  65. }