Pixel-Composer/build/Windows/0/cache/sh_noise_gabor.shader

129 lines
3.5 KiB
GLSL

//
// Simple passthrough vertex shader
//
attribute vec3 in_Position; // (x,y,z)
//attribute vec3 in_Normal; // (x,y,z) unused in this shader.
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
void main() {
vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
v_vColour = in_Colour;
v_vTexcoord = in_TextureCoord;
}
//######################_==_YOYO_SHADER_MARKER_==_######################@~
// Gabor noise
// By shader god Inigo Quilez (https://iquilezles.org)
// MIT License
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
uniform float seed;
uniform vec2 alignment;
uniform int alignmentUseSurf;
uniform sampler2D alignmentSurf;
float align;
uniform vec2 sharpness;
uniform int sharpnessUseSurf;
uniform sampler2D sharpnessSurf;
float sharp;
uniform vec2 rotation;
uniform int rotationUseSurf;
uniform sampler2D rotationSurf;
float rot;
uniform vec2 scale;
uniform int scaleUseSurf;
uniform sampler2D scaleSurf;
uniform vec2 dimension;
uniform vec2 position;
uniform float trRotation;
uniform vec2 augment;
vec2 hash(vec2 p) { return fract(sin(vec2(
dot(p, vec2(127.1324, 311.7874)) * (152.6178612 + seed / 10000.),
dot(p, vec2(269.8355, 183.3961)) * (437.5453123 + seed / 10000.)
)) * 43758.5453); }
vec3 gabor_wave(in vec2 p) {
vec2 ip = floor(p);
vec2 fp = fract(p);
float fa = sharp;
float fr = align * 6.283185;
float rt = rot;
vec3 av = vec3(0.0, 0.0, 0.0);
vec3 at = vec3(0.0, 0.0, 0.0);
for( int j = -2; j <= 2; j++ )
for( int i = -2; i <= 2; i++ ) {
vec2 o = vec2( i, j );
vec2 h = hash(ip + o);
vec2 r = fp - (o + h);
vec2 k = normalize(-1.0 + 2.0 * hash(ip + o + augment) );
float d = dot(r, r);
float l = dot(r, k) + rt;
float w = exp(-fa * d);
vec2 cs = vec2( cos(fr * l + rt), sin(fr * l + rt) );
av += w * vec3(cs.x, -2.0 * fa * r * cs.x - cs.y * fr * k );
at += w * vec3(1.0, -2.0 * fa * r);
}
return vec3( av.x, av.yz - av.x * at.yz / at.x ) / at.x;
}
void main() {
vec2 sca = scale;
if(scaleUseSurf == 1) {
vec4 _vMap = texture2D( scaleSurf, v_vTexcoord );
sca = vec2(mix(scale.x, scale.y, (_vMap.r + _vMap.g + _vMap.b) / 3.));
}
rot = rotation.x;
if(rotationUseSurf == 1) {
vec4 _vMap = texture2D( rotationSurf, v_vTexcoord );
rot = mix(rotation.x, rotation.y, (_vMap.r + _vMap.g + _vMap.b) / 3.);
}
rot = radians(rot);
align = alignment.x;
if(alignmentUseSurf == 1) {
vec4 _vMap = texture2D( alignmentSurf, v_vTexcoord );
align = mix(alignment.x, alignment.y, (_vMap.r + _vMap.g + _vMap.b) / 3.);
}
sharp = sharpness.x;
if(sharpnessUseSurf == 1) {
vec4 _vMap = texture2D( sharpnessSurf, v_vTexcoord );
sharp = mix(sharpness.x, sharpness.y, (_vMap.r + _vMap.g + _vMap.b) / 3.);
}
float r = radians(trRotation);
vec2 pos = v_vTexcoord;
pos.x *= (dimension.x / dimension.y);
pos = (pos - position / dimension) * mat2(cos(r), -sin(r), sin(r), cos(r)) * scale;
vec3 f = gabor_wave(pos);
vec3 col = vec3(0.5 + 0.5 * f.x);
gl_FragColor = vec4( col, 1.0 );
}