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

URP CloudShadows(2)

糯米
2年前Unity阅读 1,527

在上篇文章中,通过Screen Space Decal的方式实现了云的阴影,还介绍了一种AAA游戏大世界中渲染云影的方式。

Screen Space Deacl 表现云影的缺点

Screen Space Deacl的好处是实现起来简单,但是也有一些难以避免的缺点:

1.不好处理云影和其他阴影的融合,如下图中标注区域,会出现不自然的阴影叠加。

URP CloudShadows(2)-tajourney

本质原因是因为在Decal shader中通过alpha blend的方式,这种模拟的阴影一旦和场景阴影叠加便会出现不自然的融合。

2.在处理立体高度区域阴影会出现不自然的拉伸。这种是因为Decal投影方式造成的,虽然可以通过各种方式减轻不自然的拉伸,但是还是还是会出现。

其他表现云影的方式

  1. 在投影区域上空添加一个云层plan,通过噪声贴图和clip的方式生成对应的mesh,模拟生成一片的云层。
URP CloudShadows(2)-tajourney

这种方式的坏处是通过mesh生成的云影非常硬,这对于大部分项目是难以接受的。

2.通过后处理的方式,实际上还是存在与decal相同的混合问题。

URP CloudShadows(2)-tajourney

原因同上,两张图通过alpha blend叠加造成的。

3.接下来就是我即将要介绍的方式,通过类似Screen Space Shadow的处理方式,来做云的阴影,正确处理阴影的融合。

Screen Space Shadow原理

我单独写了一篇文章。

屏幕空间阴影(Screen Space Shadows)

Cloud Shadow 实现思路

首先讲Shader

Vertex Shader就是个FullscreenVert,可以直接拿官方的来用,没什么好说的。

Fragment Shader中实现cloud Shadow本身的方式和Decal中没区别,通过一张或多张noise噪声来生成。

需要注意的是我们需要从深度图里重建屏幕的世界坐标,随后把其转换到阴影(光照)的坐标系下,做这一点的原因在Screen Space Shadow原理中已经讲的很清楚了。

                // To calculate the UV coordinates for sampling the depth buffer,
                // divide the pixel location by the render target resolution
                // _ScaledScreenParams.
                float2 uv = input.positionCS.xy / _ScaledScreenParams.xy;

                // Sample the depth from the Camera depth texture.
                #if UNITY_REVERSED_Z
                    float depth = SampleSceneDepth(uv);
                #else
                    // Adjust Z to match NDC for OpenGL ([-1, 1])
                    float depth = lerp(UNITY_NEAR_CLIP_VALUE, 1, SampleSceneDepth(uv));
                #endif

                // Reconstruct the world space positions.
                float3 worldPos = ComputeWorldSpacePosition(uv, depth, UNITY_MATRIX_I_VP);

                #if UNITY_REVERSED_Z
                    // Case for platforms with REVERSED_Z, such as D3D.
                    if (depth < 0.0001) return half4(0, 0, 0, 1);
                #else
                    // Case for platforms without REVERSED_Z, such as OpenGL.
                    if (depth > 0.9999) return half4(0, 0, 0, 1);
                #endif
                
                //shadow attenuation
                float shadow = MainLightRealtimeShadow(TransformWorldToShadowCoord(worldPos));

最后得到的阴影应该是 max(shadow,cloud shadow)。

Renderfeature中我们把shader得到的结果最终输入到_ScreenSpaceShadowMapTexture,启用ScreenSpaceShadow相关Keyword,关闭其他的阴影Keyword,大功告成。

class ScreenSpaceCloudShadowsRenderPass : ScriptableRenderPass
{
   ...
   CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.MainLightShadows, false);
   CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.MainLightShadowCascades, false);
   CoreUtils.SetKeyword(cmd, ShaderKeywordStrings.MainLightShadowScreen, true);
   ...
}

另外提一句,我们这种做法实际上是在不修改管线的前提下走了URP ScreenSpaceShadow 原本的流程,所以启用上面的RenderFeature后需要禁用URP的ScreenSpaceShadow Pass,而且原本URP的ScreenSpaceShadow Pass是无法对半透物体生效的,所以我们还需要额外添加一个Pass执行这个逻辑,在渲染半透明物体之前禁用相关Keywords,启用正常的阴影。如果项目组不介意修改管线这样最好,直接在原本的Screen Space Shadow Pass的基础上修改即可。

最终效果

URP CloudShadows(2)-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
喜欢