《Unity的URP项目中使用自定义shader导致材质消失的解决办法》

        在Unity中使用URP时,会有需求使用自定义的一些shader来实现特殊效果,这时如果我们直接使用新建材质与无光照着色器(Unlit shader),可能会发生一个对于新手而言意料之外的问题——物体!消失了!

解决办法:

        打开你正在使用的的通用渲染器(Universal Renderer Data),找到渲染(Rendering)->深度引动模式(Depth Priming Mode),将其从默认的“自动”修改为“已禁用”。


如果你的问题解决了并且想知道为什么的话,请接着往下阅读。

        什么是深度引动模式?深度引动技术是Unity2021.2中URP管线的新增功能。在Unity的文档中是这样解释的:“The feature uses a depth prepass to determine which pixel shader invocations Unity can skip”,通过使用一种用于预处理深度信息的Pass来帮助Unity跳过对部分片元的渲染。而在使用Unity2021默认的URP项目时,其自动生成的通用渲染器文件(Universal Renderer Data)会默认开启这一项技术,而这也是问题的根源。

        为什么深度引动模式会导致我们的物体消失?首先必须澄清的是,这并不是Unity的什么Bug,而是很典型的新手效应事件,对不熟悉技术的使用导致了意料之外的错误。深度引动模式需要使用一种LightMode为DepthOnly的特殊Pass来生成场景中不透明物体的深度图,而我们所创建的无光照着色器是不具有该类型Pass的(因为压根就没写这东西),这就导致在开启了该技术的渲染流程中,这些使用了“不具备DepthOnlyPass的shader”的物体无法生成深度信息从而被Unity过早剔除无法进行后续的渲染,造成了物体的消失。

        因此若想在URP项目中同时使用深度引动技术与自定义shader,则务必注意需要在自定义shader中向Unity声明DepthOnlyPass用于执行深度引导。幸运的是Unity在Universal Render Pipeline内置的Unlit shader中已经实现了该Pass,在自定义shader中使用以下语句即可直接使用。

UsePass "Universal Render Pipeline/Unlit/DepthOnly

对比使用前后:

       左侧未使用DepthOnlyPass,右侧则添加了DepthOnlyPass,两者均在前向渲染的情况下开启了深度引动模式。可见在使用了DepthOnlyPass的情况下,Unity通过DepthPrepass记录了我们Sphere的深度信息,从而保证了后续DrawOpaqueObjects的正确执行。

Tips:

  • 深度引动模式只工作在前向渲染的情况下,因此在通用渲染器中为你的项目选择延迟渲染路径的话就能绕过这个问题。
  • 深度引动模式只针对不透明物体进行优化,因此如果你将物体的渲染队列设置为“透明”,那么即使不添加DepthOnlyPass也能正常渲染,不过代价是什么呢?
  • 更多参考资料可以查看官方文档,以及Unity工程师NicoLeyman在论坛中的一些回答

"The more you know, the more you know you don't know."

——Daniel Kahneman

  • 18
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: Unity的Universal Render Pipeline(URP)确实支持透明材质Shader。 在URP,我们可以使用URP的内置SRP(Scriptable Render Pipeline)来创建自定义的着色器,以满足透明材质的需求。 使用URP,我们可以在Shader代码添加透明度的计算逻辑,以控制材质的透明程度。例如,在片段着色器,我们可以通过修改Alpha通道的值来实现透明效果。我们也可以在顶点着色器根据需要计算透明度。 此外,URP还提供了一些内置的透明材质着色器,在创建新的材质时可以直接使用。这些内置的着色器已经针对URP进行了优化,可以在透明材质提供良好的渲染效果。 在使用URP的过程,我们可以通过添加透明材质材质属性来调整材质的透明度。这些属性可以在Unity Editor进行调整,方便我们在创建和调试透明材质时进行实时预览。 需要注意的是,透明材质的渲染需要消耗更多的计算资源,因为在渲染过程需要进行混合计算。因此,在使用透明材质时,我们需要合理地控制透明度的使用,以避免过度使用透明效果导致性能下降。 总之,UnityURP确实支持透明材质Shader,并提供了多种方法来实现和调整透明材质的效果。 ### 回答2: 是的,Unity URP(Universal Render Pipeline)支持透明材质Shader。透明材质Shader是一种用于渲染半透明和透明物体的ShaderURP提供了一套预设的Shader和渲染管线,其包含了透明材质Shader,使得开发者可以在URP下创建透明效果。 使用透明材质Shader,您可以为对象设置不同的透明度,实现不同程度的半透明或透明效果。透明材质Shader可以用于渲染玻璃、水、烟雾、云等效果,以及各种需要透明度的场景。 在URP,透明材质Shader的设置相对简单,您可以通过在材质属性设置透明度和透明模式来调整材质的透明效果。透明度值越低,物体越不透明;透明模式可以选择多种不同的选项,如混合、剪切等,用以适应不同的渲染需求。 URP的透明材质Shader还支持其他一些功能,例如透明投影、透明遮挡剔除等。这些功能可以提高透明效果的真实感和准确性,使得渲染结果更加精细和逼真。 总的来说,Unity URP对透明材质Shader的支持使得开发者可以轻松地实现各种透明效果,并且提供了一系列功能来优化和增强透明渲染效果,让游戏和应用的画面更加出色。 ### 回答3: Unity URP(Universal Render Pipeline)是Unity引擎的一个渲染管线,它支持透明材质Shader。 透明材质在游戏开发非常常见,例如用来实现玻璃、水面、烟雾、火焰等效果。Unity URP提供了强大的渲染功能和灵活的材质系统,可以轻松实现透明材质的效果。 在Unity URP,我们可以使用自定义Shader来创建透明材质,或者使用引擎自带的Shader来快速实现透明材质。这些Shader主要包括标准表面着色器(Standard Surface Shader)和通用着色器(Unlit Shader)。 标准表面着色器(Standard Surface Shader)是Unity URP最为常用的Shader之一,它使用了基于物理的渲染模型,可以实现透明材质的透明效果。通过调整透明度属性(Alpha)和透明模式(Alpha Mode),我们可以控制材质的透明度和透明合成方式。 通用着色器(Unlit Shader)是一种简单而灵活的Shader,不基于物理的渲染模型。我们可以在这个Shader使用AlphaTest模式实现透明材质的效果。通过设置透明度的阈值,素材像素的透明度高于该阈值时可见,低于该阈值时被剔除。 除了以上两种常用的ShaderUnity URP还提供了其他各种不同类型的Shader来满足开发者的需求。无论是选择使用自定义Shader还是引擎预置的ShaderUnity URP都支持透明材质的创建和渲染。 总之,Unity URP提供了丰富的Shader选项,支持透明材质的创建和渲染。开发者可以根据自己的需求选择适合的Shader来实现透明效果,并通过调整透明度和透明模式等属性来控制材质的透明度和合成方式。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值