tajourney tajourney
  • 首页
  • 渲染
    • PBR
    • NPR
  • 引擎
    • Unity
    • UE
  • DCC
    • Houdini
    • PhotoShop
    • Blender
  • 优化
  • 工具
  • 杂谈
    • 游戏
  • 友链
  • 关于
    • About Me
    • 网站公告
    • 维护记录
    • QA
  • 注册
  • 登录
首页 › 渲染 › Blob Shadow 和 Planar Shadow

Blob Shadow 和 Planar Shadow

糯米
2年前渲染阅读 1,127

最近研究阴影比较多,这里就介绍两种比较古早的阴影技术吧:Blob Shadow和Planar Shadow。虽然都是比较早期的技术,但是在某些低开销的场合你仍然能看到它们的身影:其中Blob Shadow多用于2D游戏中,Planar Shadow多用于一些moba游戏。

Blob Shadow

早期的游戏中,Blob Shadow基本全是挂一个黑色渐变的圈在人物脚底下。

Blob Shadow 和 Planar Shadow-tajourney
Blob Shadow 和 Planar Shadow-tajourney

因为受技术/硬件/性能等各方原因,早期游戏都不太好实时表现阴影,所以都选择这种以一张特殊图片的方案表现阴影。现代的游戏中,Blob Shadow在2D top-down类型的游戏中用的比较多,以Unity官方的Happpy Harvest Demo为例:

人物阴影以及对应素材:

Blob Shadow 和 Planar Shadow-tajourney
Blob Shadow 和 Planar Shadow-tajourney

树木阴影以及对应素材:

Blob Shadow 和 Planar Shadow-tajourney
Blob Shadow 和 Planar Shadow-tajourney

窗户阴影以及对应素材:

Blob Shadow 和 Planar Shadow-tajourney
Blob Shadow 和 Planar Shadow-tajourney

以上阴影其实都是Blob Shadow的思想。

Blob Shadow实现起来非常简单,就不赘述了。

Planar Shadow

Planar Shadow的思想也很简单,将整个模型拍扁到平面上,只需要在Vertex Shader里做坐标变换即可。

Blob Shadow 和 Planar Shadow-tajourney
Blob Shadow 和 Planar Shadow-tajourney

自己简单推导了一下:

Blob Shadow 和 Planar Shadow-tajourney

shader代码表示:

                shadowPosWS.xz = vertexInput.positionWS.xz - lightDir.xz * max(_Height , vertexInput.positionWS.y) /lightDir.y;
                shadowPosWS.y = min(vertexInput.positionWS.y,_Height);
                output.positionCS = TransformWorldToHClip(shadowPosWS);
Blob Shadow 和 Planar Shadow-tajourney
Blob Shadow 和 Planar Shadow-tajourney

PlanarShadow混合

利用模板测试和Offset,使自身混合时正确,解决Z fighting。

            Stencil
            {
                Ref 0
                Comp equal
                Pass incrWrap
                Fail keep
                ZFail keep
            }
            Offset -1 , 0

PlanarShadow阴影渐变

方法很多,这里写个从根节点到坐标渐变的方式:

                float3 center = float3(unity_ObjectToWorld[0].w , _Height , unity_ObjectToWorld[2].w);
                float falloff = 1- saturate(distance(shadowPosWS , center) * _ShadowFalloff);
                output.color.xyz = _ShadowColor.xyz;
                output.color.w = lerp(0.2,1,_ShadowColor.w * falloff);
Blob Shadow 和 Planar Shadow-tajourney

PlanarShadow支持SRP Batch

利用URP RenderObjects Pass,一遍绘制所有需要投影的物体。

Blob Shadow 和 Planar Shadow-tajourney
赞(3)
搜索
近期文章
  • 终末地人物渲染(更新中) 2025年3月17日
  • Unity APV体素化光栅化实现 2025年2月5日
  • Unity 不同 ReflectionProbe 打断 Instancing 解决方案 2025年1月15日
  • Renderdoc 原神截帧记录 2024年8月22日
  • Houdini VAT:Vellum Cltoh笔记 2 2024年7月17日
归档
  • 2025年3月 (1)
  • 2025年2月 (1)
  • 2025年1月 (1)
  • 2024年8月 (1)
  • 2024年7月 (2)
  • 2024年1月 (1)
  • 2023年10月 (3)
  • 2023年9月 (4)
  • 2023年8月 (5)
  • 2023年7月 (4)
  • 2023年6月 (4)
  • 2023年5月 (1)
  • 2023年4月 (3)
  • 2023年3月 (11)
  • 2023年2月 (11)
  • 2023年1月 (1)
  • 2022年7月 (1)
  • 2022年6月 (2)
  • 2022年5月 (1)
  • 2022年4月 (1)
  • 2022年3月 (1)
  • 2022年2月 (1)
  • 2022年1月 (7)
  • 3
Copyright © 2022-2025 tajourney. Dev by nuomi 版权所有.
鲁ICP备19015245号
  • 首页
  • 渲染
    • PBR
    • NPR
  • 引擎
    • Unity
    • UE
  • DCC
    • Houdini
    • PhotoShop
    • Blender
  • 优化
  • 工具
  • 杂谈
    • 游戏
  • 友链
  • 关于
    • About Me
    • 网站公告
    • 维护记录
    • QA
糯米
日语学习中
68
文章
15
评论
44
喜欢