glshader.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // glshader.h
  2. //
  3. // Copyright (C) 2001-2006, Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #ifndef _CELENGINE_GLSHADER_H_
  10. #define _CELENGINE_GLSHADER_H_
  11. #include <string>
  12. #include <vector>
  13. #include <iostream>
  14. #include <celmath/vecmath.h>
  15. #include "gl.h"
  16. #include "glext.h"
  17. class GLShaderLoader;
  18. enum GLShaderStatus
  19. {
  20.     ShaderStatus_OK,
  21.     ShaderStatus_CompileError,
  22.     ShaderStatus_LinkError,
  23.     ShaderStatus_OutOfMemory,
  24.     ShaderStatus_EmptyProgram,
  25. };
  26. class GLShader
  27. {
  28.  protected:
  29.     GLShader(GLhandleARB _id);
  30.     virtual ~GLShader();
  31.  public:
  32.     GLhandleARB getID() const;
  33.  private:
  34.     GLhandleARB id;
  35.     GLShaderStatus compile(const std::vector<std::string>& source);
  36.     friend class GLShaderLoader;
  37. };
  38. class GLVertexShader : public GLShader
  39. {
  40.  private:
  41.     GLVertexShader(GLhandleARB _id) : GLShader(_id) {};
  42.  friend class GLShaderLoader;
  43. };
  44. class GLFragmentShader : public GLShader
  45. {
  46.  private:
  47.     GLFragmentShader(GLhandleARB _id) : GLShader(_id) {};
  48.  friend class GLShaderLoader;
  49. };
  50. class GLProgram
  51. {
  52.  private:
  53.     GLProgram(GLhandleARB _id);
  54.     void attach(const GLShader&);
  55.  public:
  56.     virtual ~GLProgram();
  57.     GLShaderStatus link();
  58.     void use() const;
  59.     GLhandleARB getID() const { return id; }
  60.  private:
  61.     GLhandleARB id;
  62.  friend class GLShaderLoader;
  63. };
  64. class FloatShaderParameter
  65. {
  66.  public:
  67.     FloatShaderParameter();
  68.     FloatShaderParameter(GLhandleARB _obj, const char* name);
  69.     FloatShaderParameter& operator=(float);
  70.     
  71.  private:
  72.     int slot;
  73. };
  74. class Vec3ShaderParameter
  75. {
  76.  public:
  77.     Vec3ShaderParameter();
  78.     Vec3ShaderParameter(GLhandleARB _obj, const char* name);
  79.     Vec3ShaderParameter& operator=(const Vec3f&);
  80.     Vec3ShaderParameter& operator=(const Point3f&);
  81.  private:
  82.     int slot;
  83. };
  84. class Vec4ShaderParameter
  85. {
  86.  public:
  87.     Vec4ShaderParameter();
  88.     Vec4ShaderParameter(GLhandleARB _obj, const char* name);
  89.     Vec4ShaderParameter& operator=(const Vec4f&);
  90.  private:
  91.     int slot;
  92. };
  93. class GLShaderLoader
  94. {
  95.  public:
  96.     static GLShaderStatus CreateVertexShader(const std::vector<std::string>&,
  97.                                              GLVertexShader**);
  98.     static GLShaderStatus CreateFragmentShader(const std::vector<std::string>&,
  99.                                                GLFragmentShader**);
  100.     static GLShaderStatus CreateVertexShader(const std::string&,
  101.                                              GLVertexShader**);
  102.     static GLShaderStatus CreateFragmentShader(const std::string&,
  103.                                                GLFragmentShader**);
  104.     static GLShaderStatus CreateProgram(const GLVertexShader& vs,
  105.                                         const GLFragmentShader& fs,
  106.                                         GLProgram**);
  107.     static GLShaderStatus CreateProgram(const std::vector<std::string>& vs,
  108.                                         const std::vector<std::string>& fs,
  109.                                         GLProgram**);
  110.     static GLShaderStatus CreateProgram(const std::string& vs,
  111.                                         const std::string& fs,
  112.                                         GLProgram**);
  113. };
  114. extern std::ostream* g_shaderLogFile;
  115. #endif // _CELENGINE_GLSHADER_H_