Solucion #
lo primero que se implementa es el fragment shader, para esto la idea es dividir con frag el shader y crear los patrones, para este caso no se construllo algun patron con los tiles en especifico sino que se empleo una funcion que genera aleatoreos para rotar las baldosas.
Truchet Tiles fragment shader
#ifdef GL_ES
precision mediump float;
#endif
uniform vec2 u_resolution;
uniform float u_time;
uniform int option;
uniform float vel;
// funcion para rotar las baldosas
float Hash21(vec2 p){
p=fract(p*vec2(264.34,435.345));
p+=dot(p,p+34.23);
return fract(p.x*p.y);
}
void main(){
vec2 coord=gl_FragCoord.xy/u_resolution;
vec3 color=vec3(0.);
//para mover el shader
coord+=u_time*vel;
coord*=10.;
//se divide el shader
vec2 gv=fract(coord)-.5;
vec2 id=floor(coord);
float n=Hash21(id);
float width=.2;
//se efectua la rotacion
if(n<.5){
gv.x*=-1.;
}
//patron de dos lineas diagonales
float d=abs(abs(gv.x+gv.y)-.5);
float mask=smoothstep(.01,-.01,d-width);
color+=mask;
gl_FragColor=vec4(color,1.);
}
aqui lo unico que nos faltaria es emplearlo como textura, para ello usamos el createGraphics() y usamos un modelo de caballo para mostrar los patrones (ya que los truchet son a blanco y negro se queria mostrar como se verian estos patrones como si fueran zebras),
sketch.js
let shaderu;
let pg;
let horse;
function preload() {
shaderu = loadShader("/showcase/basic.vert", "/showcase/all_truchet.frag");
horse = loadModel("/showcase/horse.obj", true);
}
function setup() {
createCanvas(580, 580, WEBGL);
textuSha = createGraphics(580, 580, WEBGL);
//configuracion de la textura
textuSha.textureMode(NORMAL);
textuSha.shader(shaderu);
textureMode(NORMAL);
noStroke();
//pasamos las uniform de u_resolution
shaderu.setUniform("u_resolution", [
width * pixelDensity(),
height * pixelDensity(),
]);
//opciones
option = createSelect();
option.position(10, 10);
option.option("option 0", 0);
option.option("option 1", 1);
option.option("option 2", 2);
option.option("option 3", 3);
option.option("option 4", 4);
option.selected("none");
option.changed(() => {
shaderu.setUniform("option", option.value());
});
//slider de velocidad
vel = createSlider(0, 1, 0.05, 0.05);
vel.position(10, 25);
vel.style("width", "280px");
}
function draw() {
background(199, 255, 237);
//cambiamos las uniforsm
shaderu.setUniform("u_mouse", [mouseX, mouseY]);
shaderu.setUniform("u_time", frameCount / 10);
shaderu.setUniform("vel", vel.value());
//creamos la textura, en este caso lo usamos con rect (se podria
//usar cualquier otra forma) y se aplica al modelo del caballo
textuSha.rect(0, 0, width, height);
texture(textuSha);
orbitControl();
rotateX(20);
rotateZ(150);
model(horse);
}
la idea de los truchet y la implementacion con los shaders se sacaron del tutorial de youtube Shader Coding: Truchet Tiling Explained!