在 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;看得见但不对,再修法线;本来有厚度,就别偷懒。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐