131 lines
3.0 KiB
Plaintext
131 lines
3.0 KiB
Plaintext
|
#version 430 core
|
||
|
#define PI 3.1415926538f
|
||
|
|
||
|
//layout(local_size_x = 8, local_size_y = 8) in;
|
||
|
layout(local_size_x = 1) in;
|
||
|
|
||
|
//#define LORENZ
|
||
|
#define CLIFFORD
|
||
|
//#define DREAM
|
||
|
|
||
|
layout(rgba32f) uniform image2D img_output;
|
||
|
uniform sampler2D u_skybox;
|
||
|
uniform sampler2D u_tex1;
|
||
|
uniform sampler2D u_tex2;
|
||
|
uniform sampler2D u_tex3;
|
||
|
uniform sampler2D u_tex4;
|
||
|
uniform sampler2D u_tex5;
|
||
|
|
||
|
struct SceneObject{
|
||
|
vec4 position;
|
||
|
};
|
||
|
|
||
|
layout(std140, binding=2) uniform shader_data{
|
||
|
vec4 camera_position; // 4 * 4 16
|
||
|
vec4 camera_rotation; // 4 * 4 32
|
||
|
vec2 _PixelOffset; // 4 * 2 40
|
||
|
ivec2 screenSize; // 4 * 2 48
|
||
|
int iterations; // 4 52
|
||
|
float _Seed; // 4 56
|
||
|
int objectcount; // 4 60
|
||
|
int _sample; // 4 64
|
||
|
int _samples; // 4 68
|
||
|
float dt; // 4 72
|
||
|
vec2 padding; // 4 * 2 80
|
||
|
};
|
||
|
layout (std430, binding = 3) coherent buffer object_data{
|
||
|
SceneObject objects[];
|
||
|
};
|
||
|
|
||
|
float distlimit = 500;
|
||
|
float seed = _Seed;
|
||
|
int samples = _samples;
|
||
|
vec2 _Pixel;
|
||
|
|
||
|
float rand(){
|
||
|
float result = fract(sin(seed / 100.0f * dot(_Pixel, vec2(12.9898f, 78.233f))) * 43758.5453f);
|
||
|
seed += 1.0f;
|
||
|
return result;
|
||
|
}
|
||
|
|
||
|
ivec2 GetPixelCoords(float x, float y){
|
||
|
#ifdef LORENZ
|
||
|
float div = 30.0f;
|
||
|
#endif
|
||
|
#ifdef CLIFFORD
|
||
|
float div = 3.0f;
|
||
|
#endif
|
||
|
#ifdef DREAM
|
||
|
float div = 3.0f;
|
||
|
#endif
|
||
|
x = x / div;
|
||
|
y = y / div;
|
||
|
|
||
|
x += 1;
|
||
|
y += 1;
|
||
|
|
||
|
x /= 2.0f;
|
||
|
y /= 2.0f;
|
||
|
|
||
|
return ivec2(int(x * screenSize.x + 0.5f), int(y * screenSize.y + 0.5f));
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
void main(){
|
||
|
int id = int(gl_GlobalInvocationID.x);
|
||
|
|
||
|
float x = objects[id].position.x;
|
||
|
float y = objects[id].position.y;
|
||
|
float z = objects[id].position.z;
|
||
|
|
||
|
ivec2 coords = GetPixelCoords(x, y);
|
||
|
|
||
|
vec4 pixel = imageLoad(img_output, coords);
|
||
|
|
||
|
//vec4 color = (vec4(249.0f, 29.0f, 0.0f, 255.0f) / 255.0f);
|
||
|
//vec4 color = (vec4(249.0f, 29.0f, 0.0f, 255.0f) / 255.0f);
|
||
|
vec4 color = vec4(0);
|
||
|
|
||
|
//color = mix(color, pixel, .99999f);
|
||
|
color = mix(color, pixel, .9999f);
|
||
|
//color = mix(color, pixel, .2f);
|
||
|
|
||
|
//imageStore(img_output, coords, pixel + color * .05f);
|
||
|
//imageStore(img_output, coords, pixel + color * .0001f);
|
||
|
imageStore(img_output, coords, color);
|
||
|
|
||
|
#ifdef LORENZ
|
||
|
float s=10.0f;
|
||
|
float r=28.0f;
|
||
|
float b=2.667f;
|
||
|
|
||
|
float x_dot = s*(y - x);
|
||
|
float y_dot = r*x - y - x*z;
|
||
|
float z_dot = x*y - b*z;
|
||
|
|
||
|
objects[id].position.x += x_dot * .001f * dt;
|
||
|
objects[id].position.y += y_dot * .001f * dt;
|
||
|
objects[id].position.z += z_dot * .001f * dt;
|
||
|
#endif
|
||
|
|
||
|
#ifdef CLIFFORD
|
||
|
float a =-1.7f;
|
||
|
float b = 1.8f;
|
||
|
float c =-1.9f;
|
||
|
float d =-0.4f;
|
||
|
|
||
|
objects[id].position.x = sin(a*y)+c*cos(a*x);
|
||
|
objects[id].position.y = sin(b*x)+d*cos(b*y);
|
||
|
#endif
|
||
|
|
||
|
#ifdef DREAM
|
||
|
float a =-2.8276f;
|
||
|
float b = 1.2813f;
|
||
|
float c =1.9655f;
|
||
|
float d =0.597f;
|
||
|
|
||
|
objects[id].position.x = sin(y*b)+c*sin(x*b);
|
||
|
objects[id].position.y = sin(x*a)+d*sin(y*a);
|
||
|
#endif
|
||
|
}
|