Unity URP 下的双面渲染(Cull Off)如何正确处理树叶、布料这类薄片物体
在 Universal Render Pipeline 里,默认情况下背面会被剔除。对盒子、墙体这类封闭模型没问题; 但对树叶、旗帜、纸片、卡片草这类“只有一层面”的薄片物体来说,背面一旦被剔掉,镜头转到另一侧就会直接穿帮。 这时就要考虑关闭背面剔除,也就是 Cull Off。
它解决什么问题?
让单层几何体的正反两面都能被看到,避免树叶翻面消失、布料背面透明、卡片草从背面直接“没了”。
它的核心代价
更多片元会被渲染,填充率和像素着色成本上升。不是所有模型都该开,尤其不该把它当成默认选项。
一句话理解
Cull Off = 不再丢掉背面三角形。 对薄片模型是补救,对实体模型通常是浪费。
1. 为什么薄片物体最容易出问题?
树叶和布料在游戏里常常不是一个有厚度的实体,而是用一张或几张平面来模拟。这样建模便宜、贴图高效、批量摆放也方便。 但代价也很直接:如果材质仍然保持默认的背面剔除,摄像机看到背面时,这一面就根本不会进入渲染流程。

Unity 官方文档里对 Render Face = Both 的解释很直接:URP 不会剔除任一侧,因此几何体的两侧都会参与可见性与光照贡献。
2. 哪些对象适合开双面渲染?
判断标准很简单:如果模型本身没有厚度,但玩家又可能看到它的背面,那就值得考虑。反过来,真正有体积的实体模型,通常仍然应该保持默认剔除。

3. 在 URP 里怎么开启?
在 URP 中,常见有两条路:一条是 Shader Graph / 材质设置,另一条是手写 Shader。前者适合大多数美术工作流,后者适合你要精确控制渲染行为的时候。
01
Shader Graph / 材质面板
新版 Unity / URP 里,很多时候不再直接写 “Two Sided”,而是把 Render Face 设为 Both。本质上就是关闭背面剔除。
- 打开 Shader Graph 或材质面板
- 找到 Render Face
- 从 Front / Back 改成 Both
02
手写 Shader
如果你自己写 Pass,关键行就是 Cull Off。只要关闭剔除,背面三角形也会被送进后续流程。
- 在对应 Pass 内写 Cull Off
- 若是透明或裁剪材质,留意排序和阴影
- 若出现背面受光反转,补做法线翻转处理
Pass
{
Name "ForwardLit"
Tags { "LightMode" = "UniversalForward" }
Cull Off
HLSLPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDHLSL
}
这段代码的重点只有一处:默认的 Cull Back 改成 Cull Off。从效果上说,就是告诉 GPU:别再默认丢掉背面了。
4. 双面显示了,不代表受光一定正确
这是实际项目里最容易被忽略的一点。模型两面都画出来之后,你看到的只是“可见性”问题被解决了; 但背面的法线方向仍可能与正面相反,导致高光、明暗、法线贴图方向看起来不对。

half3 normalWS = normalize(IN.normalWS);
if (!IN.isFrontFace)
{
normalWS = -normalWS;
}
half NdotL = saturate(dot(normalWS, mainLight.direction));
return half4(albedo * NdotL, alpha);
这不是一段“直接复制就能在所有工程编译通过”的完整模板,而是把双面受光处理的核心逻辑拆出来给你看。 不同 URP 版本、不同模板 Shader,对正反面语义(例如 SV_IsFrontFace / 宏封装)的写法会有差异。
5. 什么时候不该开 Cull Off?
如果对象本身就是有厚度的实体,双面渲染往往只是在浪费性能,甚至可能让阴影和光照判断变复杂。
实体模型别滥开
箱子、墙、石头、金属零件本来就有体积,正确做法是建模出厚度,而不是依靠双面渲染“补洞”。
透明材质要更谨慎
透明 + 双面 会放大排序问题。看起来像“穿插”“层叠错误”,很多时候不是 Cull Off 本身,而是透明排序天生复杂。
植被场景留意填充率
大片树叶、草地、布帘都开双面时,片元数量会明显增加。移动平台尤其要关注 overdraw 和 fillrate。
6. 实战建议:把它当“精准开关”,不要当默认模板
- 只有当模型是薄片、无厚度、且需要从背面可见时,才开启双面渲染。
- 在 URP / Shader Graph 中,优先找 Render Face = Both;手写 Shader 时则使用 Cull Off。
- 如果背面光照看起来发黑、反亮或法线方向不对,再补上正反面法线翻转逻辑。
- 对植被、布料等大面积资源,测试移动端 fillrate,不要只在 PC 编辑器里看效果。
- 如果对象本来该有厚度,优先改模型,而不是靠关闭剔除来“假装正确”。
记忆口诀: 看不见,用 Cull Off;看得见但不对,再修法线;本来有厚度,就别偷懒。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)