How to create a camera in ShaderToy
创建一个注视某点的相机
float DistLine(vec3 ro, vec3 rd, vec3 p)
{
return length(cross(p-ro, rd)/length(rd));
//叉乘计算空间中p-ro和rd个向量组成的平行四边形的面积,与rd乘该平行四边形的高相等
//面积除以得出高,为点p到射线rd的距离
}
float DrawPoint(vec3 ro, vec3 rd, vec3 p)
{
float d = DistLine(ro, rd, p);
d = smoothstep(0.06,0.05,d);
return d;
}
void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
//vec2 uv = fragCoord/iResolution.xy;
//uv -= 0.5;
//uv.x *=iResolution.x/iResolution.y;
vec2 uv = (fragCoord - (0.5 * iResolution.xy)) / iResolution.y;
//将坐标按y轴标准化为(-1.0 , 1.0)
//例如屏幕分辨率为640*480时,fragCoord的值为(0,0) 到 (640,480)
//当fragCoord为(0,0)时代入以上公式,uv为(-1.33333, -1.0)
vec3 ro = vec3(0.0, 0.0, -3.0);
vec3 lookat = vec3(0.5);
float zoom = 1.0;
vec3 f = normalize(lookat - ro);
vec3 r = cross(vec3(0.0, 1.0, 0.0), f);
vec3 u = cross(f, r);
vec3 c = ro + f*zoom;
vec3 i = c + uv.x*r + uv.y*u;
vec3 rd = i - ro;
float t = iTime;
float d = 0.0;
d += DrawPoint(ro, rd, vec3(0.0, 0.0, 0.0));
d += DrawPoint(ro, rd, vec3(0.0, 0.0, 1.0));
d += DrawPoint(ro, rd, vec3(0.0, 1.0, 0.0));
d += DrawPoint(ro, rd, vec3(0.0, 1.0, 1.0));
d += DrawPoint(ro, rd, vec3(1.0, 0.0, 0.0));
d += DrawPoint(ro, rd, vec3(1.0, 0.0, 1.0));
d += DrawPoint(ro, rd, vec3(1.0, 1.0, 0.0));
d += DrawPoint(ro, rd, vec3(1.0, 1.0, 1.0));
fragColor = vec4(d);
}