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 rd
ro 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.Sube
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);
}