00001
00007 #ifndef CLOUDSHADER_H
00008 #define CLOUDSHADER_H CLOUDSHADER_H
00009
00010 #include "Shader.h"
00011 #include "PerlinNoise3D.h"
00012
00017 class CloudShader : public Shader
00018 {
00019 private:
00024 ColorRGBA color;
00025
00030 PerlinNoise3D pnoise;
00031
00032 public:
00033
00034 CloudShader(Scene *scene,
00035 ColorRGBA color = ColorRGBA (0.08,0.15,0.27))
00036 : Shader(scene),color(color)
00037 {};
00038
00045 ColorRGBA Shade(Ray &ray)
00046 {
00047 Vector3D pos = ray.org + ray.t * ray.dir;
00048 PAIR uv = ray.hit->GetUV(ray);
00049
00050
00051 float total = 0.0f;
00052 float persistence = 0.7f;
00053 float amplitude = persistence;
00054 float freq = 0.01;
00055 float x = pos.x() * 10;
00056 float y = pos.y() * 10;
00057 float z = (pos.z() + scene->timer.GetTime() * 0.01) * 10;
00058 for (int i = 0; i < 8; i++) {
00059 total += amplitude * pnoise.noise(x*freq, y*freq, z*freq);
00060 freq *= 2;
00061 amplitude *= persistence;
00062 }
00063
00064 if (total < 0) total = 0;
00065 if (total > 1) total = 1;
00066
00067 return (color + ColorRGBA(total)).interpolated(ColorRGBA(.9,.9,1),pow(1-uv.second-0.5,12));
00068 };
00069 };
00070
00071 #endif