shadermeh/shaders/tiling.frag

72 lines
2.5 KiB
GLSL

#define sqrt25 0.6324555320 //sqrt(2./5.)
#define sqrt35 0.7745966692 //sqrt(3./5.)
//edge distance of a Cube
float cubeDist(vec3 uvw) {
vec3 d = abs(uvw); //mirroring along axis
return min(d.x, min(d.y, d.z))*2.; //*2. for 0-1 range
}
// Cube Tiling
vec4 cubeTile(vec3 uvw) {
vec3 grid = fract(uvw)-.5; // centered UVW coords
float edist = cubeDist(grid); // edge distance
//float cdist = dot(grid,grid); //squared center distance
//vec3 id = uvw-grid; // Cells IDs
return vec4(grid, edist);
}
// scaled with offset cube tiling
vec4 cubeCell(vec3 uvw, vec3 offset, float gridRes) {
vec4 cubeTiling = cubeTile(uvw*gridRes + offset);
vec3 tiledUV = (cubeTiling.xyz - offset)/gridRes; //cube pixaltion
return vec4(tiledUV,cubeTiling.w);
}
// rotates a vetor from SirBelfer4 (https://www.shadertoy.com/view/ssc3z4)
vec3 rotate(vec3 v, vec3 a)
{
// https://math.stackexchange.com/questions/2975109/how-to-convert-euler-angles-to-quaternions-and-get-the-same-euler-angles-back-fr
vec4 q;
vec3 c = cos(a * 0.5), s = sin(a * 0.5);
q.x = s.x * c.y * c.z - c.x * s.y * s.z;
q.y = c.x * s.y * c.z + s.x * c.y * s.z;
q.z = c.x * c.y * s.z - s.x * s.y * c.z;
q.w = c.x * c.y * c.z + s.x * s.y * s.z;
// https://blog.molecular-matters.com/2013/05/24/a-faster-quaternion-vector-multiplication/
vec3 qt = 2.0 * cross(q.xyz, v);
return v + q.w * qt + cross(q.xyz, qt);
}
// makes RdYlBu_r colormap with polynimal 6 https://www.shadertoy.com/view/Nd3fR2
vec3 RdYlBu_r(float t) {
const vec3 c0 = vec3(0.207621,0.196195,0.618832);
const vec3 c1 = vec3(-0.088125,3.196170,-0.353302);
const vec3 c2 = vec3(8.261232,-8.366855,14.368787);
const vec3 c3 = vec3(-2.922476,33.244294,-43.419173);
const vec3 c4 = vec3(-34.085327,-74.476041,37.159352);
const vec3 c5 = vec3(50.429790,67.145621,-1.750169);
const vec3 c6 = vec3(-21.188828,-20.935464,-6.501427);
return c0+t*(c1+t*(c2+t*(c3+t*(c4+t*(c5+t*c6)))));
}
void mainImage( out vec4 fragColor, in vec2 fragCoord ) {
vec2 uv = fragCoord/iResolution.y; //square UV pattern
float time = (0.05*iTime); // used as z dimension
float gridRes = 2.5; //size of cubes
vec3 point = vec3(uv, time); //uvw cords
//cosmetic rotate for fun triangles otherwise it looks so square
point = rotate(point, (vec3(sqrt25,sqrt35,0.))); //vec3 must be normalized
vec4 a = cubeCell(point, vec3(0.), gridRes);
vec3 col = RdYlBu_r(a.w); // cosmetic Colormap
fragColor = vec4(col, 1.);
}