2022-10-23

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);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 马头“沂南诗社”琐谈 1917年,马头镇的徐...
    不系之舟_522阅读 1,598评论 3 1
  • 2022年10学23日 《担心和期待是毒药!唯有痛,可以让自己彻底改变》 最近忙于工作,观呼吸做的次数有些...
    ab604c81ac13阅读 126评论 0 0
  • SQL- 结构化查询语言- 关系数据库全都同SQL来操作 1.安装MongoDB- 安装- 配置环境变量C:\Pr...
    Teemo_fca4阅读 165评论 0 0
  • 22岁的时候,我第一次看爱在系列。男主不是我喜欢的类型,杂乱的胡子头发,絮叨的对白让我头昏脑涨,我只记得女主...
    389582c0fcb5阅读 141评论 0 1
  • 至少从比喻上说,大型科技公司已经成为詹姆斯二世的意外版本:强大的实体,单方面的治理。正如本·汤普森(Ben Tho...
    斧正堂阅读 104评论 0 9