ComputePlayground/shaders/attractors/objectCompute.compute

145 lines
3.4 KiB
Plaintext
Raw Permalink Normal View History

2022-11-09 23:54:43 +01:00
#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
2022-11-09 23:54:43 +01:00
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 mouse_movement; // 4 * 2 80
2022-11-09 23:54:43 +01:00
};
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);
if(mouse_movement.x != 0 || mouse_movement.y != 0)
{
objects[id].position.x -= mouse_movement.x * 3;
objects[id].position.y += mouse_movement.y * 3;
return;
}
2022-11-09 23:54:43 +01:00
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, .99f);
// color = mix(color, pixel, .2f);
2022-11-09 23:54:43 +01:00
//imageStore(img_output, coords, pixel + color * .05f);
//imageStore(img_output, coords, pixel + color * .0001f);
imageStore(img_output, coords, color);
// for(int i = 0; i < iterations; i++){
#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
// x = objects[id].position.x;
// y = objects[id].position.y;
// z = objects[id].position.z;
// }
2022-11-09 23:54:43 +01:00
}