Back to shaders

Shader test bench

Truchet Tile.fs

vidvox-isf-files pattern glsl runnable fragment MIT
Source
runnable fragment

Complete GLSL fragment shader. Stronghold runs it directly when the browser can compile it.

Code

uniform float tSize;
uniform float nSeed;
uniform vec4 color1;
uniform vec4 color2;
uniform int lineMode;
precision mediump float;
/*{
    "CATEGORIES": [
        "Geometry"
    ],
    "CREDIT": "pjkarlik",
    "DESCRIPTION": "Creates a Truchet Tile pattern",
    "INPUTS": [
        {
            "DEFAULT": 0.1,
            "LABEL": "Size",
            "MAX": 1,
            "MIN": 0,
            "NAME": "tSize",
            "TYPE": "float"
        },
        {
            "DEFAULT": 0.35,
            "LABEL": "Noise Seed",
            "MAX": 1,
            "MIN": 0,
            "NAME": "nSeed",
            "TYPE": "float"
        },
        {
            "DEFAULT": [
                1,
                1,
                1,
                1
            ],
            "LABEL": "Color 1",
            "NAME": "color1",
            "TYPE": "color"
        },
        {
            "DEFAULT": [
                0,
                0,
                0,
                1
            ],
            "LABEL": "Color 2",
            "NAME": "color2",
            "TYPE": "color"
        },
        {
            "DEFAULT": 0,
            "NAME": "lineMode",
            "TYPE": "bool"
        }
    ],
    "ISFVSN": "2"
}
*/



//	adapted from https://github.com/pjkarlik/TruchetTiles/blob/master/src/shader/truchet/fragmentShader.js


#define PI 3.14159265358979323846264

vec2 hash2(vec2 p) {
  vec2 o = (p+0.5)/256.0;
  return o;
}
float goldNoise(vec2 coord, float seed){
  float phi = 1.61803398874989484820459 * 00000.1;
  float pi2 = PI * 00000.1;
  float sq2 = 1.41421356237309504880169 * 10000.0;
  float temp = fract(
    sin(
      dot(
        coord*(seed+phi), vec2(phi, pi2)
      )
    ) * sq2
  );
  return temp;
}
vec3 pattern(vec2 uv) {
  vec2 grid = floor(uv);
  vec2 subuv = fract(uv);
  float mult = 0.5;
  float dnoise = goldNoise(grid, nSeed);
  vec2 rand = hash2(grid);
  float shade = 0.;
  float df;
  float check = dnoise;
  if( check <= .25 ) {
    df = subuv.x - subuv.y; // tl
  } else if( check <= .5 ) {
    df = 1. - subuv.y - subuv.x;
  } else if( check <= .75 ) {
    df = subuv.y - subuv.x;
  } else if( check <= 1. ) {
    df = subuv.y - 1. + subuv.x;
  }
  shade = smoothstep(.0, -.02, df);
  if (lineMode)
	shade += smoothstep(.02, .04, df);
  return vec3( shade );
}
void main() {
  float fScale = (tSize == 0.0) ? max(u_resolution.x,u_resolution.y) : 1.0 / tSize;
  vec2 uv = (gl_FragCoord.xy - 0.5 * u_resolution.xy) / min(u_resolution.y, u_resolution.x);
  uv *= fScale;
  vec3 colour = pattern(uv);
  vec4 returnMe = (colour.r == 1.0) ? color1 : color2;
  gl_FragColor = returnMe;
}