learn GLSL from zero
ToolsCrea con shadersShader MakerCrea shaders gratis en líneaToolkitObras de shaders listas para tu webSketcher LabPinta el hero de tu landing con shaders3D StudioEl editor Three.js en tu navegador
GamesJuega con shadersOnomatoShaderEscribe una palabra y explótalaThe WatcherUn ojo que te sigueAetherVidrio líquido con un ojo adentroBloomcoreUna palabra hace crecer un jardín de luzPyrokineAvienta fuego a la paredVoltaicLa pirámide lanza rayosSurfSurfea un océano de shader

Lección 4 de 10 · Patrones en shaders

Tablero

Diamantes en el tablero. El piso del Overlook.

¿Cómo alternas dos colores en una cuadrícula? Sumas la fila y la columna. Si la suma es par, un color. Si es impar, el otro. Eso es todo.

mod(x, 2.), una pregunta, dos respuestas. El patrón más antiguo.

floor() redondea hacia abajo, convierte las coordenadas en números enteros. Esos números son la fila y la columna de cada celda. mod() te dice si la suma es par o impar.

mod(x, 2.)Devuelve el residuo de dividir entre 2. Si el número es par, devuelve 0. Si es impar, devuelve 1. Una pregunta, dos respuestas, un tablero entero.
PruebaCambia el 4. a 8., tablero más fino. Cambia uno de los colores para que sea tu tablero. Prueba sumarle + T * 0.5 a p.x antes del floor, el tablero se desliza.

El código

void main(){
  vec2 p = (2.*gl_FragCoord.xy - R) / min(R.x, R.y);
  float check = mod(floor(p.x*4.)+floor(p.y*4.), 2.);
  vec2 cell = fract(p * 4.);
  vec2 q = abs(cell - 0.5);
  float diamond = q.x + q.y;
  float inner = smoothstep(0.35, 0.32, diamond) * check;
  float innerGlow = exp(-max(diamond-.25,0.)*8.) * check * .3;
  float groove = smoothstep(0.44,0.5, max(q.x, q.y));
  vec2 qs = abs(cell - 0.5 + vec2(.03,-.04));
  float dsh = smoothstep(0.35,.1, qs.x+qs.y) * (1.-inner) * check * .35;
  vec3 a = vec3(0.9, 0.2, 0.12);
  vec3 b = vec3(0.06, 0.04, 0.12);
  vec3 gold = vec3(0.95, 0.75, 0.2);
  vec3 col = mix(a, b, check);
  col *= 1. - groove * .6;
  col -= vec3(dsh);
  col += gold * inner;
  col += vec3(.5,.35,.1) * innerGlow;
  gl_FragColor = vec4(col, 1.);
}
close