Unity SOFT SHADOWS WITH PCF

我的上一篇博客里有提到过 shadowmap 本文是基于上文的基础上的
https://blog.csdn.net/A13155283231/article/details/95642265

在这里插入图片描述
PCF 的全称是 Percentage closer Filtering
我翻译它为 百分比邻近过滤
原理 就是把周围的点加起来做均值,以得到淡化的效果

  • 修正一下,其实是对很多次阴影比较的结果加起来做平均值
  • 得到的结果就不是0/1了,而是介于二者之间

在片元着色器里修改下 阴影判断封装下就好了 代码还算简单?

...
float lookup(float2 offSet, v2f i)
{

     // return shadow2DProj(ShadowMap, ShadowCoord + 
     //                             vec4(offSet.x * xPixelOffset * ShadowCoord.w, 
     //                                     offSet.y * yPixelOffset * ShadowCoord.w, 
     //                                     0.05, 
     //                                     0.0) ).w;

     float planeDepth = i.ShadowCoord.z;

     fixed4 dcol = tex2Dproj(_DepthTexture, i.ShadowCoord + float4(offSet * 0.001, 0, 0));
     float boxDepth = DecodeFloatRGBA(dcol);

     float  shadow = planeDepth + directionalLightShadowMapBias > boxDepth ? 0.5 : 1.0;

     return shadow;
 }
 ...
fixed4 frag(v2f i) : SV_Target
{
	fixed4 col = fixed4(1,1,1,1);
                
    float shadow = 0;
    
    // 8x8 kernel
    float x,y;
    for (y = -3.5 ; y <=3.5 ; y+=1.0)
    {
        for (x = -3.5 ; x <=3.5 ; x+=1.0)
        {
            shadow += lookup(float2(x,y), i);
        }
    }

    shadow /= 64.0 ;
    return col * shadow;
}

不过还有个问题 参考的代码里还有个 * ShadowCoord.w不知道啥意思

泊松分布

在这里插入图片描述
稍微修改下就变成了泊松采样,可以解决 莫尔效应 的问题。 但是还是不好看 ?
PoissonOffsets 预生成的数组 https://developer.nvidia.com/gameworks-directx-samples
最后一个例子里可以找到

// Possion
 for (int j = 0; j < 64; ++j)
 {
     float2 offset = PoissonOffsets[j] * float2(3, 3);
     shadow += lookup(offset, i);
 }
 shadow /= 64.0 ;
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值