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

OpenGL

开发平台:

Visual C++

  1. // shadermanager.h
  2. //
  3. // Copyright (C) 2001-2004, 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_SHADERMANAGER_H_
  10. #define _CELENGINE_SHADERMANAGER_H_
  11. #include <map>
  12. #include <iostream>
  13. #include <celengine/glshader.h>
  14. #include <celengine/lightenv.h>
  15. #include <celengine/atmosphere.h>
  16. #define ADVANCED_CLOUD_SHADOWS 0
  17. class ShaderProperties
  18. {
  19.  public:
  20.     ShaderProperties();
  21.     bool usesShadows() const;
  22.     bool usesFragmentLighting() const;
  23.     bool usesTangentSpaceLighting() const;
  24.     unsigned int getShadowCountForLight(unsigned int) const;
  25.     void setShadowCountForLight(unsigned int, unsigned int);
  26.     bool hasShadowsForLight(unsigned int) const;
  27.     bool hasSharedTextureCoords() const;
  28.     bool hasSpecular() const;
  29.     bool hasScattering() const;
  30.     bool isViewDependent() const;
  31.  enum
  32.  {
  33.      DiffuseTexture          =   0x01,
  34.      SpecularTexture         =   0x02,
  35.      NormalTexture           =   0x04,
  36.      NightTexture            =   0x08,
  37.      SpecularInDiffuseAlpha  =   0x10,
  38.      RingShadowTexture       =   0x20,
  39.      OverlayTexture          =   0x40,
  40.      CloudShadowTexture      =   0x80,
  41.      CompressedNormalTexture =  0x100,
  42.      EmissiveTexture         =  0x200,
  43.      VertexOpacities         =  0x800,
  44.      VertexColors            = 0x1000,
  45.      Scattering              = 0x2000,
  46.      PointSprite             = 0x4000,
  47.      SharedTextureCoords     = 0x8000,
  48.  };
  49.  enum
  50.  {
  51.      DiffuseModel          = 0,
  52.      SpecularModel         = 1,
  53.      RingIllumModel        = 2,
  54.      PerPixelSpecularModel = 3,
  55.      OrenNayarModel        = 4,
  56.      AtmosphereModel       = 5,
  57.      LunarLambertModel     = 6,
  58.      ParticleDiffuseModel  = 7,
  59.      EmissiveModel         = 8,
  60.      ParticleModel         = 9,
  61.  };
  62.  
  63.  enum
  64.  {
  65.      VolumetricScatteringEffect      = 0x0001,
  66.      VolumetricAbsorptionEffect      = 0x0002,
  67.      VolumetricEmissionEffect        = 0x0004,
  68.  };
  69.  
  70.  public:
  71.     unsigned short nLights;
  72.     unsigned short texUsage;    
  73.     unsigned short lightModel;
  74.     // Two bits per light, up to eight lights + three shadows per light
  75.     unsigned short shadowCounts;
  76.     
  77.     // Effects that may be applied with any light model
  78.     unsigned short effects;
  79. };
  80. static const unsigned int MaxShaderLights = 4;
  81. static const unsigned int MaxShaderShadows = 3;
  82. struct CelestiaGLProgramLight
  83. {
  84.     Vec3ShaderParameter direction;
  85.     Vec3ShaderParameter diffuse;
  86.     Vec3ShaderParameter specular;
  87.     Vec3ShaderParameter halfVector;
  88.     FloatShaderParameter brightness; // max of diffuse r, g, b
  89. };
  90. struct CelestiaGLProgramShadow
  91. {
  92.     Vec4ShaderParameter texGenS;
  93.     Vec4ShaderParameter texGenT;
  94.     FloatShaderParameter falloff;
  95.     FloatShaderParameter maxDepth;
  96. };
  97. class CelestiaGLProgram
  98. {
  99.  public:
  100.     CelestiaGLProgram(GLProgram& _program, const ShaderProperties&);
  101.     ~CelestiaGLProgram();
  102.     void use() const { program->use(); }
  103.     
  104.     void setLightParameters(const LightingState& ls,
  105.                             Color materialDiffuse,
  106.                             Color materialSpecular,
  107.                             Color materialEmissive
  108. #ifdef USE_HDR
  109.                            ,float nightLightScale = 1.0f
  110. #endif
  111.                             );
  112.     void setEclipseShadowParameters(const LightingState& ls,
  113.                                     float planetRadius,
  114.                                     const Mat4f& planetMat);
  115.     void setAtmosphereParameters(const Atmosphere& atmosphere,
  116.                                  float atmPlanetRadius,
  117.                                  float objRadius);
  118.     
  119.  public:
  120.     CelestiaGLProgramLight lights[MaxShaderLights];
  121.     Vec3ShaderParameter fragLightColor[MaxShaderLights];
  122.     Vec3ShaderParameter fragLightSpecColor[MaxShaderLights];
  123.     FloatShaderParameter fragLightBrightness[MaxShaderLights];
  124.     Vec3ShaderParameter eyePosition;
  125.     FloatShaderParameter shininess;
  126.     Vec3ShaderParameter ambientColor;
  127.     FloatShaderParameter opacity;
  128. #ifdef USE_HDR
  129.     FloatShaderParameter nightLightScale;
  130. #endif
  131.     FloatShaderParameter ringWidth;
  132.     FloatShaderParameter ringRadius;
  133.     
  134.     // Mix of Lambertian and "lunar" (Lommel-Seeliger) photometric models.
  135.     // 0 = pure Lambertian, 1 = L-S
  136.     FloatShaderParameter lunarLambert;
  137.     // Diffuse texture coordinate offset
  138.     FloatShaderParameter textureOffset;
  139.     // Cloud shadow parameters
  140.     // Height of cloud layer above planet, in units of object radius
  141.     FloatShaderParameter cloudHeight;
  142.     FloatShaderParameter shadowTextureOffset;
  143.     
  144.     // Parameters for atmospheric scattering; all distances are normalized for
  145.     // a unit sphere.
  146.     FloatShaderParameter mieCoeff;
  147.     FloatShaderParameter mieScaleHeight;
  148.     // Value of k for Schlick approximation to Henyey-Greenstein phase function
  149.     // A value of 0 is isotropic, negative values a primarily backscattering,
  150.     // positive values are forward scattering.
  151.     FloatShaderParameter miePhaseAsymmetry;
  152.     
  153.     // Rayleigh scattering terms. There are three scattering coefficients: red,
  154.     // green, and blue light. To simulate Rayleigh scattering, the coefficients 
  155.     // should be in ratios that fit 1/wavelength^4, but other values may be used
  156.     // to simulate different types of wavelength dependent scattering.
  157.     Vec3ShaderParameter rayleighCoeff;
  158.     FloatShaderParameter rayleighScaleHeight;
  159.     
  160.     // Precomputed sum and inverse sum of Rayleigh and Mie scattering coefficients
  161.     Vec3ShaderParameter scatterCoeffSum;
  162.     Vec3ShaderParameter invScatterCoeffSum;
  163.     // Precomputed sum of absorption and scattering coefficients--identical to
  164.     // scatterCoeffSum when there is no absorption.
  165.     Vec3ShaderParameter extinctionCoeff;
  166.     
  167.     // Radius of sphere for atmosphere--should be significantly larger than
  168.     // scale height. Three components:
  169.     //    x = radius
  170.     //    y = radius^2
  171.     //    z = 1/radius
  172.     Vec3ShaderParameter atmosphereRadius;
  173.     // Scale factor for point sprites
  174.     FloatShaderParameter pointScale;
  175.     CelestiaGLProgramShadow shadows[MaxShaderLights][MaxShaderShadows];
  176.     
  177.  private:
  178.     void initParameters();
  179.     void initSamplers();
  180.     FloatShaderParameter floatParam(const std::string&);
  181.     Vec3ShaderParameter vec3Param(const std::string&);
  182.     Vec4ShaderParameter vec4Param(const std::string&);
  183.     GLProgram* program;
  184.     const ShaderProperties props;
  185. };
  186. class ShaderManager
  187. {
  188.  public:
  189.     ShaderManager();
  190.     ~ShaderManager();
  191.     CelestiaGLProgram* getShader(const ShaderProperties&);
  192.  private:
  193.     CelestiaGLProgram* buildProgram(const ShaderProperties&);
  194.     
  195.     GLVertexShader* buildVertexShader(const ShaderProperties&);
  196.     GLFragmentShader* buildFragmentShader(const ShaderProperties&);
  197.     
  198.     GLVertexShader* buildRingsVertexShader(const ShaderProperties&);
  199.     GLFragmentShader* buildRingsFragmentShader(const ShaderProperties&);
  200.     
  201.     GLVertexShader* buildAtmosphereVertexShader(const ShaderProperties&);
  202.     GLFragmentShader* buildAtmosphereFragmentShader(const ShaderProperties&);
  203.     GLVertexShader* buildEmissiveVertexShader(const ShaderProperties&);
  204.     GLFragmentShader* buildEmissiveFragmentShader(const ShaderProperties&);
  205.     GLVertexShader* buildParticleVertexShader(const ShaderProperties&);
  206.     GLFragmentShader* buildParticleFragmentShader(const ShaderProperties&);
  207.     std::map<ShaderProperties, CelestiaGLProgram*> shaders;
  208. };
  209. extern ShaderManager& GetShaderManager();
  210. #endif // _CELENGINE_SHADERMANAGER_H_