cloudy-raytracer/shader/cloudshader.h

48 lines
1.1 KiB
C
Raw Normal View History

#ifndef CG1_TRACER_CLOUDSHADER_H
#define CG1_TRACER_CLOUDSHADER_H
#include "scene/scene.h"
#include "shader.h"
2023-01-24 19:38:12 +01:00
#include "light/light.h"
#include "primitive/primitive.h"
#include "common/noise/worleynoise.h"
int const NOISE_SIZE = 128;
2023-01-24 19:38:12 +01:00
int const TRANSMITTANCE_BREAK = 0.01f; // If transmittance goes below this limit, the cloud is considered opaque
struct CloudSettings
{
int densitySamples = 100;
2023-01-24 19:38:12 +01:00
int lightSamples = 25;
2023-01-24 08:35:10 +01:00
float scale = 10;
float densityTreshold = 0.55f;
float densityIntensity = 2.5f;
2023-01-24 11:18:03 +01:00
float densityAbsorption = 2;
2023-01-24 08:39:13 +01:00
Color cloudColor = Color(1, 1, 1);
2023-01-24 19:38:12 +01:00
float darknessThreshold = 0.1f;
};
class CloudShader : public Shader
{
public:
CloudShader(CloudSettings const &settings = CloudSettings());
// Shader functions
Color shade(Scene const &scene, Ray const &ray) const;
private:
CloudSettings settings;
bool isTransparent() const;
2023-01-24 06:26:24 +01:00
Noise cloudNoise;
float getCloudDensity(Vector3d point) const;
2023-01-24 19:38:12 +01:00
Color lightMarch(const Scene &scene, Vector3d position, const Ray &ray) const;
};
#endif //CG1_TRACER_CLOUDSHADER_H