#define MSP_GL_SKY_H_
#include "effect.h"
-#include "framebuffer.h"
#include "programdata.h"
#include "rendertarget.h"
namespace Msp {
namespace GL {
+class DirectionalLight;
class Mesh;
-class Light;
class Program;
/**
-Renders a procedurally generated sky at the background. Based on the paper
-"A Scalable and Production Ready Sky and Atmosphere Rendering Technique" by
-Sébastien Hillaire (https://sebh.github.io/publications/egsr2020.pdf).
+Renders a procedurally generated sky at the background.
+
+In addition to the background, the transmittance of the sun light is calculated
+to produce realistic lighting at dawn and dusk.
+
+Based on the techniques described in "A Scalable and Production Ready Sky and
+Atmosphere Rendering Technique" by Sébastien Hillaire
+(https://sebh.github.io/publications/egsr2020.pdf).
*/
class Sky: public Effect
{
static Planet earth();
};
+ struct Template: Effect::Template
+ {
+ class Loader: public DataFile::DerivedObjectLoader<Template, Effect::Template::Loader>
+ {
+ private:
+ static ActionMap shared_actions;
+
+ public:
+ Loader(Template &, Collection &);
+ private:
+ virtual void init_actions();
+ };
+
+ DirectionalLight *sun = 0;
+
+ virtual Sky *create(const std::map<std::string, Renderable *> &) const;
+ };
+
private:
- const Light &sun;
+ Planet planet;
+ DirectionalLight &sun;
RenderTarget transmittance_lookup;
const Program &transmittance_shprog;
bool transmittance_lookup_dirty;
const Program &backdrop_shprog;
const Sampler &sampler;
const Sampler &wrap_sampler;
+ const Texture &dummy_texture;
mutable ProgramData shdata;
+ float view_height;
bool rendered;
public:
- Sky(Resources &, Renderable &, const Light &);
+ Sky(Renderable &, DirectionalLight &);
void set_planet(const Planet &);
void set_view_height(float);
+ Color get_transmittance(const Vector3 &);
+
virtual void setup_frame(Renderer &);
virtual void finish_frame();
virtual void render(Renderer &, Tag = Tag()) const;
+
+ virtual void set_debug_name(const std::string &);
};
} // namespace GL