You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity技术问询:如何仅渲染物体位于平面上方的部分?

Unity实现平面裁剪:仅渲染Cube在Plane上方的部分

核心原理

通过自定义Shader在片元着色阶段,判断每个像素的世界空间位置是否处于目标Plane的上方,若处于下方则直接丢弃该像素,从而实现局部隐藏的效果。

详细操作步骤

  1. 搭建基础场景

    • 在Hierarchy窗口右键,依次创建3D Object > Plane和3D Object > Cube
    • 调整Plane的位置(比如设Transform.position.y = 0),Cube初始位置设为Transform.position.y = 1(确保完全在Plane上方)
  2. 创建裁剪Shader

    • 在Project窗口右键,选择Create > Shader > Unlit Shader,重命名为ClipAbovePlane
    • 双击打开Shader文件,替换原有代码为以下内容:
      Shader "Custom/ClipAbovePlane"
      {
          Properties
          {
              _MainTex ("Texture", 2D) = "white" {}
              _ClipY ("Clip Y Position", Float) = 0.0 // 裁剪平面的Y坐标,和Plane的Y保持一致
          }
          SubShader
          {
              Tags { "RenderType"="Opaque" }
              LOD 100
      
              Pass
              {
                  CGPROGRAM
                  #pragma vertex vert
                  #pragma fragment frag
      
                  #include "UnityCG.cginc"
      
                  struct appdata
                  {
                      float4 vertex : POSITION;
                      float2 uv : TEXCOORD0;
                  };
      
                  struct v2f
                  {
                      float2 uv : TEXCOORD0;
                      float4 worldPos : TEXCOORD1; // 传递世界空间位置到片元着色器
                      float4 vertex : SV_POSITION;
                  };
      
                  sampler2D _MainTex;
                  float4 _MainTex_ST;
                  float _ClipY;
      
                  v2f vert (appdata v)
                  {
                      v2f o;
                      o.vertex = UnityObjectToClipPos(v.vertex);
                      o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                      o.worldPos = mul(unity_ObjectToWorld, v.vertex); // 计算顶点的世界空间位置
                      return o;
                  }
      
                  fixed4 frag (v2f i) : SV_Target
                  {
                      // 判断当前像素的世界空间Y是否小于裁剪平面的Y,是则丢弃
                      if(i.worldPos.y < _ClipY)
                      {
                          discard;
                      }
                      // 采样纹理输出颜色
                      fixed4 col = tex2D(_MainTex, i.uv);
                      return col;
                  }
                  ENDCG
              }
          }
      }
      
  3. 创建并配置材质

    • 在Project窗口右键,选择Create > Material,重命名为ClipMaterial
    • 在Inspector窗口,点击材质的Shader下拉框,选择Custom > ClipAbovePlane
    • 将这个材质拖到Hierarchy窗口的Cube对象上
    • 在材质面板中,设置Clip Y Position为Plane的Y坐标(比如0)
  4. 测试效果

    • 拖动Cube的Y轴向下,当Y>0时完整显示,Y在0附近时只显示上半部分,Y<0时完全隐藏

进阶:支持任意方向的Plane裁剪

如果需要Plane可以旋转(不只是水平裁剪),可以修改Shader,用平面方程来判断:

  1. 在Shader的Properties里添加:
    _PlaneNormal ("Plane Normal", Vector) = (0,1,0,0) // Plane的法线方向
    _PlanePos ("Plane Position", Vector) = (0,0,0,0) // Plane上任意一点的位置
    
  2. 修改片元着色器的判断逻辑:
    // 计算像素位置到平面的距离,平面方程:dot(normal, pos - planePos) >= 0 在平面上方
    float distance = dot(_PlaneNormal, i.worldPos.xyz - _PlanePos.xyz);
    if(distance < 0)
    {
        discard;
    }
    
  3. 使用时,将Plane的Transform.up赋值给Plane Normal,Transform.position赋值给Plane Position即可实现任意方向的裁剪

内容的提问来源于stack exchange,提问作者SafraZhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:37:59