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 1 de 10 · Ray marching en GLSL

El rayo

Una cámara, un rayo por pixel. El cielo es su dirección.

Hasta ahora cada pixel preguntaba ¿qué color soy?. En 3D pregunta otra cosa: ¿hacia dónde estoy mirando? Cada pixel dispara un rayo desde el ojo de la cámara hacia la escena.

El ojo es ro (ray origin). La dirección es rd (ray direction), y sale de las coordenadas de pantalla: normalize(vec3(uv,-fov)). Todavía no hay nada que chocar, así que pintamos el cielo según hacia dónde apunta el rayo: arriba un color, abajo otro.

ro y rdro es de dónde sale el rayo (la cámara). rd es hacia dónde va, un vector de largo 1. Todo raymarching empieza con estos dos. El fov separa los rayos: más alto = lente más cerrado, más zoom.
PruebaSube fov=1.5 a 2.5 y el mundo se acerca. El segundo slider afila el sol del horizonte (12.0).

El código

precision highp float;
void main(){
  vec2 uv=(gl_FragCoord.xy*2.0-R)/R.y;
  vec3 ro=vec3(0.0,0.0,3.0);
  float fov=1.5;
  vec3 rd=normalize(vec3(uv,-fov));
  float h=rd.y*0.5+0.5;
  vec3 col=mix(vec3(0.42,0.16,0.12), vec3(0.10,0.14,0.40), h);
  vec3 sunDir=normalize(vec3(0.3,0.25,-1.0));
  float sun=pow(max(0.0,dot(rd,sunDir)),12.0);
  col+=vec3(0.98,0.70,0.38)*sun*0.9;
  gl_FragColor=vec4(col,1.0);
}
close