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

如何将带自定义Shader的Unity AR Portal Quad转为半圆形?

把Unity矩形Quad改成半圆形AR Portal的几种方法

别担心,刚接触Unity遇到这种形状调整的问题太正常了!我给你几个简单可行的方案,帮你把矩形Quad改成半圆形,完美适配你的360°图片Portal Shader:

方法一:直接生成半圆形Mesh(最推荐,无额外依赖)

这种方法会直接替换Quad的原始Mesh,生成一个真正的半圆形网格,对Shader兼容性最好。

  1. 创建一个新的C#脚本,命名为CreateSemiCircleMesh,把下面的代码复制进去:
using UnityEngine;

[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class CreateSemiCircleMesh : MonoBehaviour
{
    [Header("半圆形参数")]
    public float radius = 1f; // 半圆半径
    public int segments = 32; // 分段数,越高越平滑

    void Start()
    {
        GenerateSemiCircleMesh();
    }

    void GenerateSemiCircleMesh()
    {
        Mesh mesh = new Mesh();
        Vector3[] vertices = new Vector3[segments + 2];
        int[] triangles = new int[segments * 3];
        Vector2[] uv = new Vector2[segments + 2];

        // 第一个顶点是圆心
        vertices[0] = Vector3.zero;
        uv[0] = new Vector2(0.5f, 0.5f); // 对应360图的中心

        // 生成半圆的顶点和UV
        for (int i = 0; i <= segments; i++)
        {
            float angle = Mathf.PI * i / segments; // 0到π的角度(上半圆)
            float x = Mathf.Cos(angle) * radius;
            float y = Mathf.Sin(angle) * radius;
            vertices[i + 1] = new Vector3(x, y, 0);
            
            // 映射UV到0-1范围,适配360图
            uv[i + 1] = new Vector2((x / radius + 1) / 2, (y / radius + 1) / 2);
        }

        // 生成三角面
        for (int i = 0; i < segments; i++)
        {
            triangles[i * 3] = 0;
            triangles[i * 3 + 1] = i + 1;
            triangles[i * 3 + 2] = i + 2;
        }

        // 赋值给Mesh
        mesh.vertices = vertices;
        mesh.triangles = triangles;
        mesh.uv = uv;
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();

        GetComponent<MeshFilter>().mesh = mesh;
    }
}
  1. 把这个脚本拖到你的Quad对象上,在Inspector面板里调整radius(半径)和segments(平滑度),运行游戏后,Quad就会变成一个上半圆。如果想要下半圆,把代码里的Mathf.PI改成-Mathf.PI或者调整角度范围就行。

方法二:用Mask组件快速实现(适合快速测试)

如果不想改Mesh,可以用Unity的Mask组件来裁剪Quad的显示区域:

  • 新建一个Image对象,选择一个圆形的Sprite(或者在Sprite Editor里把圆形裁剪成半圆)
  • 给这个Image添加Mask组件,取消勾选Show Mask Graphic(避免显示遮罩本身)
  • 把你的Portal Quad拖到这个Mask对象下面作为子物体
  • 调整Quad的大小和位置,让它和Mask的半圆区域对齐

⚠️ 注意:有些自定义Shader可能不支持Mask,这时候需要给Shader添加Stencil模板测试的Pass。比如在你的Shader里加入这段代码:

Pass
{
    Stencil
    {
        Ref 1
        Comp Equal
        Pass Keep
    }

    // 这里保留你原来的Shader渲染代码
}

同时给Mask的Image的Material设置成默认的UI/Default或者支持Stencil的Shader。

方法三:修改自定义Shader(通过UV裁剪)

如果不想改Mesh或加组件,也可以直接在你的Portal Shader里添加裁剪逻辑,只显示Quad的一半:
找到Shader的片元着色器(frag函数),在输出颜色之前加入这段代码:

// 只显示上半圆(UV.y > 0.5),如果要下半圆就改成<0.5
if (i.uv.y < 0.5)
{
    discard; // 丢弃不需要的像素
}

如果想要平滑的边缘,可以用smoothstep做柔化处理:

float edgeSmooth = 0.02; // 边缘柔化范围
float alpha = smoothstep(0.5 - edgeSmooth, 0.5 + edgeSmooth, i.uv.y);
col.a *= alpha;

这样裁剪出来的半圆边缘会更柔和,不会有生硬的锯齿。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:00:31