时间:2025-08-20 15:16
人气:
作者:admin
【从UnityURP开始探索游戏渲染】专栏-直达
(x_min, y_min, width, height)(frag_x, frag_y)frag_x < x_min 或 frag_x > x_min + width,丢弃片元frag_y < y_min 或 frag_y > y_min + height,丢弃片元RectMask2D组件
csharp
// 示例:为UI面板添加裁剪
GameObject panel = GameObject.Find("UIPanel");
panel.AddComponent<RectMask2D>();
在Shader中启用裁剪并定义区域:
hlsl
SubShader {
Pass {
// 开启GPU裁剪指令
Cull Off
ZTest Always
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
// 声明裁剪区域(需在脚本中动态传入)
uniform float4 _ScissorRect; // (x, y, width, height)
fixed4 frag (v2f i) : SV_Target {
// 手动检测片元位置
if (i.screenPos.x < _ScissorRect.x ||
i.screenPos.x > _ScissorRect.x + _ScissorRect.z ||
i.screenPos.y < _ScissorRect.y ||
i.screenPos.y > _ScissorRect.y + _ScissorRect.w) {
discard; // 丢弃区域外片元
}
return fixed4(1,1,1,1);
}
ENDCG
}
}
通过Screen.scissorRect动态设置:
csharp
// 定义裁剪区域(左下角坐标100,100,宽高各300像素)
Rect scissorRect = new Rect(100, 100, 300, 300);
// 启用裁剪
GL.Enable(EnableCap.ScissorTest);
GL.Scissor((int)scissorRect.x, (int)scissorRect.y,
(int)scissorRect.width, (int)scissorRect.height);
// 渲染操作...
GL.Disable(EnableCap.ScissorTest);// 结束需关闭
⚠️ 注意:此方法需在OnPostRender等渲染回调中调用,且要求摄像机为正交模式以保证坐标系匹配
| 配置方式 | 适用对象 | 形状支持 | 性能开销 | 灵活性 |
|---|---|---|---|---|
| RectMask2D | UGUI元素 | 仅矩形 | 低 | 低 |
| Shader脚本 | 3D模型/粒子 | 任意 | 中 | 高 |
| GL API | 全屏特效 | 仅矩形 | 最低 | 中 |
实际开发中,UI裁剪首选RectMask2D,3D对象或自定义形状需结合Shader实现;GL接口适用于全屏后处理特效的局部渲染优化
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,????)