【狗屎URP】在 Shader Graph 中使用 _CameraDepthTexture / _CameraNormalTexture

参考帖子 Resolved - How to access a specific cameras depth texture using _cameraRenderTexture in URP - Unity Forum

 

 方式一、使用 Scene Depth。

对应源码可见  Packages/com.unity.render-pipelines.universal/ShaderLibrary/DeclareNormalsTexture.hlsl 。

  • 获取的是UV对应的模型位置在场景中的深度

 

方式二、添加 Property:Texture2D reference 指向 _CameraDepthTexture【待验证,本人未尝试】

 

参考 https://x.com/rn49rn49/status/1180115225829203969。

 

方式三 、使用 Custom Function 暴露。

针对用方式二设置后,发现报错 "redefinition of '_CameraDepthTexture'" 的情况。(比如在 Full Screen Shader)

 

 首先、添加这样的 Custom Function 节点。 | 忽略红色报错,不影响正常使用。

追加说明:不要尝试归纳到某个 hlsl 文件的方法中,然后在 Custom Function Node 通过 File + MethodName 的方式来引入。会有烦人的报错,徒劳无功,徒增烦恼罢了。

 然后、如此连线。| 忽略红色报错,不影响正常使用。

 

对于 built-in 管线

参考 https://forum.unity.com/threads/custom-shader-doesnt-fill-depth-and-normals-for-post-processing.1156454/

深度和法线纹理以两种方式之一生成。


如果您使用前向渲染路径,则相机深度法线纹理是通过使用 Internal-DepthNormalsTexture.shader 渲染不透明队列对象来创建的。 “RenderType”标签在每个网格使用的着色器与该内部着色器中的子着色器上的渲染类型之间进行匹配。如果着色器的标签中没有“RenderType”,或者该内部着色器中没有类型,则不会渲染它。


延迟更简单一些。如果您的着色器不使用标准着色器,它不会出现在法线中,但可以出现在深度中。如果您将表面着色器与标准、Blinn Phong 或 Lambert 着色模型一起使用,那么它应该可以工作,因为在使用延迟时,后两个选项将使用标准着色模型进行模拟。这是因为延迟仅支持标准着色模型。了解延迟的工作方式是通过将表面属性(反照率、法线、镜面颜色、平滑度、AO、深度和环境照明)渲染到称为 GBuffer 的多个屏幕空间纹理。然后,根据这些纹理中的深度和法线数据构建相机深度法线纹理(尽管您最好使用法线 gbuffer 本身,因为它的质量要高得多)。如果您使用带有自定义着色模型的表面着色器,或者没有延迟通道的顶点片段着色器,它将在延迟通道之后渲染为前向通道,因此根本不会出现在法线纹理中。相反,它使用阴影投射通道(可能来自着色器中的后备)来渲染到 GBuffer,用黑色填充除深度之外的所有区域。这就是你得到的最好的。


Unity 可以做一些额外的工作来添加特殊的延迟前向传递,以便将表面属性注入到不透明前向着色器的 GBuffer 中,但他们没有这样做。不过,您可以自己完成此操作,方法是在一个或两个相同的网格渲染器上使用两种单独的材质,其中一种是使用标准着色器,另一种是您的自定义着色器,或者使用命令缓冲区将自定义延迟着色器渲染到 GBuffer 中。它必须是两种单独的材质,因为 Unity 只会在着色器中渲染延迟通道或前向通道,而不是两者。这是一种丑陋的解决方案,但它是 BIRP 唯一存在的解决方案。


TLDR:尝试添加阴影投射通道。

 

posted @ 2024-06-27 13:34  bakabird1998  阅读(16)  评论(0编辑  收藏  举报