您当前的位置: 首页 >  ar

Jave.Lin

暂无认证

  • 1浏览

    0关注

    704博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Unity Shader - Ray Marching - T3 - GetSurfaceNormals

Jave.Lin 发布时间:2020-04-25 14:37:21 ,浏览量:1

文章目录
  • Project
  • References
自学Raymarching汇总: Unity Shader - Ray Marching Study Summary - 学习汇总

最近忙的飞起,什么事情都扎堆的来。

好不容易挤出一些时间,继续学习。

这篇任务是,Raymarching获取表面法线。

通过类似之前文章:Unity Shader - ddx/ddy偏导函数测试,实现:锐化、高度图、Flat shading应用,的类似思路,在该文章中最后的Flat shading应用中,类似将高度图转法线图应用的方式(或是说,将梯度值转为法线)。

下面我们在Raymarching中,通过计算当前碰撞点的全局距离场与周边碰撞点的全局距离场的梯度值作为法线。

梯度值的核心思想理解视屏:动画带你理解偏导数和梯度 Gradients and Partial Derivatives(Physics Videos)熟肉

核心代码为:

float3 getNormal(float3 p) {            // 获取碰撞当前点的法线
	float d = sceneDF(p);
    float2 e = float2(EPSILON, 0); 
    float3 n = d - float3(
        sceneDF(p - e.xyy),             // 其实就是 float3(d - d1, d - d2, d - d3);
        sceneDF(p - e.yxy),
        sceneDF(p - e.yyx));
    return normalize(n);
}

fixed4 getColor(v2f i) {
    float3 ori = i.ray;                 // 射线起点
    float3 dir = normalize(i.ray);      // 射线方向
    float3 pos;                         // 当前步进到的位置
    float dist;                         // 当前步进到的最近距离
    float d;                            // 当前最近距离
    float far = _ProjectionParams.z;    // far

    ori += _WorldSpaceCameraPos.xyz;    // 偏移,加上相机位置
    pos = ori;                          // 从起点出发
    UNITY_LOOP
    for (int it = 0; it             
关注
打赏
1664331872
查看更多评论
0.0392s