Introducción a mundos 3D
Objetivo
Slides
Script: raymarching simple

Notas
Script: BloBs!

Notas
Script: Blobs + Canvas

Notas
Extra
Last updated
void main () {
vec3 color;
vec3 rd = normalize(vec3(uv(),1.5)); // Ray direction
vec3 ro = vec3(0.,0.,-3.); // Ray origin, podemos pensarlo donde ponemos la cámara
float marcha; // Acumulador de las distancias calculadas
float n; // Acumulador para crear efecto "neon"
for (int i=0; i<64; i++)
{
vec3 p =ro+marcha*rd;
float d = length(p)-1.; // SDF para una esfera de radio 1
if (d < 0.001 || marcha > 50.) {
break;
}
marcha +=d;
n += 0.1/(.9+abs(d));
}
color +=n*0.1;
gl_FragColor = vec4(color, 1.0);
}float sdEsfera(vec3 p, vec3 offset, float radio){
return length(p-offset)-radio;
}
float map(vec3 p){
//pR(p.xz, p.y*1.+time);// Rotacion sobre el eje y
float d1 = sdEsfera(p, vec3(cos(time)+1., sin(time*2.), 0.),1.);
float d2 = sdEsfera(p, vec3(cos(time)-1.,sin(time), 0.),1.);
float d = smin(d1,d2,0.9);
//d = d + + sin(p.x*10.)*0.03; // Deformaciones sobre el borde
return d;
}
void main () {
vec2 pos = uv(); vec3 color;
vec3 rd = normalize(vec3(pos,1.5));
vec3 ro = vec3(0.,0.,-10.);
float marcha;
float n;
for (int i=0; i<64; i++)
{
vec3 p =ro+marcha*rd;
float d = map(p);
if (d < 0.001 || marcha > 50.) {
break;
}
marcha +=d;
n += 0.1/(.9+abs(d));
}
color +=n*0.1;
gl_FragColor = vec4(color, 1.0);
}float sdEsfera(vec3 p, vec3 offset, float radio){
return length(p-offset)-radio;
}
float sdfCanvas(vec3 p){
float td = length(p-vec3(100.))-0.01;
for(int i=0; i < 10; ++i){
for(int j=0; j<10; ++j){
vec4 s = texture2D(channel0, vec2(float(i)/10.,float(j)/10.));
float x = mix(-1.,1.,float(i)/10.);
float y = mix(-1.,1.,float(j)/10.);
if (s.r>0.){
float d = sdEsfera(p,vec3(x,y,0.),0.15);
td = smin(d,td,0.2);
}
}
}
return td;
}
float map(vec3 p){
//repeat(p,3.);
//repeatLimit(p,5.,3.);
return sdfCanvas(p);
}
void main () {
vec2 pos = uv(); vec3 color;
vec3 rd = normalize(vec3(pos,1.5));
vec3 ro = vec3(0.,0.,-3.);
float marcha;
float n;
for (int i=0; i<64; i++)
{
vec3 p =ro+marcha*rd;
float d = map(p);
if (d < 0.001 || marcha > 50.) {
break;
}
marcha +=d;
n += 0.1/(.9+abs(d));
}
color +=n*0.2;
gl_FragColor = vec4(color, 1.0);
}