A 2D tile-based sandbox game.
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #pragma once
  2. #include <stdint.h>
  3. #include <stdexcept>
  4. #include "util.h"
  5. namespace Cygnet {
  6. struct GlCompileError: public std::exception {
  7. GlCompileError(std::string message): message(std::move(message)) {}
  8. const char *what() const noexcept override { return message.c_str(); }
  9. std::string message;
  10. };
  11. class GlShader {
  12. public:
  13. enum class Type {
  14. VERTEX,
  15. FRAGMENT,
  16. };
  17. GlShader(Type type, const char *source);
  18. virtual ~GlShader();
  19. GLuint id() const { return id_; }
  20. private:
  21. GLuint id_;
  22. };
  23. class GlVxShader: public GlShader {
  24. public:
  25. explicit GlVxShader(const char *source): GlShader(Type::VERTEX, source) {}
  26. };
  27. class GlFrShader: public GlShader {
  28. public:
  29. explicit GlFrShader(const char *source): GlShader(Type::FRAGMENT, source) {}
  30. };
  31. class GlProgram {
  32. public:
  33. template <typename... T>
  34. GlProgram(const T &... shaders): GlProgram() { (addShader(shaders), ...); link(); }
  35. GlProgram();
  36. virtual ~GlProgram();
  37. GLuint id() const { return id_; }
  38. protected:
  39. GLint attribLoc(const char *name);
  40. GLint uniformLoc(const char *name);
  41. private:
  42. void addShader(const GlShader &shader);
  43. void link();
  44. GLuint id_;
  45. };
  46. }