当前位置: 首页 > news >正文

UnityURP 使用StencilBuffer制作一个“看见看不见”的球

UnityURP 使用StencilBuffer制作一个“看见看不见”的球

  • 前言
  • 项目
    • 创建Shader
    • 创建材质
    • 搭建场景
    • Stencil Buffer 工作原理
    • 注意事项
    • 遮罩组共享机制
  • 鸣谢

前言

相机只有通过特定相框(遮罩)才能看到这个球,其他位置看不见。

在Unity中使用Stencil Buffer来实现对象遮罩效果。

请添加图片描述

项目

创建Shader

创建遮罩Shader
StencilMask.shader

Shader "Custom/StencilMask"
{Properties{_StencilID ("Stencil ID", Int) = 1}SubShader{Tags { "RenderType"="Opaque" "Queue"="Geometry-100"}ColorMask 0ZWrite offStencil{Ref [_StencilID]Comp alwaysPass replace}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;};struct v2f{float4 vertex : SV_POSITION;};v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);return o;}fixed4 frag (v2f i) : SV_Target{return fixed4(0, 0, 0, 0);}ENDCG}}
}

创建被遮罩物体Shader
StencilObject.shader

Shader "Custom/StencilObject"
{Properties{_MainTex ("Texture", 2D) = "white" {}_Color ("Color", Color) = (1,1,1,1)_StencilID ("Stencil ID", Int) = 1[Enum(UnityEngine.Rendering.CompareFunction)] _StencilComp ("Stencil Comparison", Int) = 3}SubShader{Tags { "RenderType"="Opaque" "Queue"="Geometry"}LOD 100Stencil{Ref [_StencilID]Comp [_StencilComp]}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 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;fixed4 _Color;v2f vert (appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);return o;}fixed4 frag (v2f i) : SV_Target{fixed4 col = tex2D(_MainTex, i.uv) * _Color;return col;}ENDCG}}
}

创建材质

  1. 创建两个材质:MaskMaterialStencilObjectMaterial
  2. StencilMask.shader 应用到 MaskMaterial
  3. StencilObject.shader 应用到 StencilObjectMaterial

搭建场景

  1. 创建遮罩对象(如Cube、Sphere等),并添加MaskMaterial材质
  2. 创建需要被遮罩的对象并添加StencilObjectMaterial材质
  • 被遮罩的对象只会在遮罩区域内显示
  • 可以在运行时动态修改Stencil ID来切换不同的遮罩组

Stencil Buffer 工作原理

  1. 遮罩阶段:遮罩Shader将指定的Stencil ID写入Stencil Buffer,但不输出颜色
  2. 渲染阶段:被遮罩对象Shader检查Stencil Buffer,只在匹配的区域渲染

常用Stencil比较函数

  • Never (0) - 从不通过
  • Less (1) - 小于时通过
  • Equal (2) - 等于时通过
  • LessEqual (3) - 小于等于时通过
  • Greater (4) - 大于时通过
  • NotEqual (5) - 不等于时通过
  • GreaterEqual (6) - 大于等于时通过
  • Always (7) - 总是通过

注意事项

  • 遮罩对象的渲染队列应该早于被遮罩对象(Queue=“Geometry-100” vs Queue=“Geometry”)
  • Stencil Buffer 有8位深度,支持0-255的值
  • 相同Stencil ID的对象会共享遮罩区域

遮罩组共享机制

使用相同Stencil ID的对象会形成"联合遮罩区域":

  • ID=1的圆形 + ID=1的方形 = 圆形+方形的联合区域
  • 被遮罩对象只在这个联合区域内显示

鸣谢

Claude Code

http://www.dtcms.com/a/309130.html

相关文章:

  • 第三方采购流程
  • 前端图片懒加载的深度指南:从理论到实战
  • 使用 whisper, 音频分割, 初步尝试,切割为小块,效果还不错 1
  • java对象的内存分配
  • linux编译基础知识-工具链
  • datagrip连接mysql数据库过程以及遇到的问题
  • Linux网络:多路转接 epoll
  • 深入讲讲异步FIFO
  • Blender 4.5 安装指南:快速配置中文版,适用于Win/mac/Linux系统
  • 汽车EDI:Vitesco EDI 项目案例
  • 基于单片机汽车少儿安全预警系统
  • 【世纪龙科技】汽车整车维护仿真教学软件-智构整车维护实训
  • Oracle EBS ERP开发 — 抛出异常EXCEPTION书写规范
  • 【世纪龙科技】3D交互深度赋能-汽车整车维护仿真教学软件
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现道路汽车的检测识别(C#代码,UI界面版)
  • Apache RocketMQ for AI 战略升级,开启 AI MQ 新时代
  • GXP6040K压力传感器可应用于医疗/汽车/家电
  • 在SQL SERVER 中,用SSMS 实现存储过程的每日自动调用
  • 嵌入式系统教学范式演进:云端仿真平台如何重构温湿度监测实验教学
  • Web开发-PHP应用弱类型脆弱Hash加密Bool类型Array数组函数转换比较
  • 动态规划 Dynamic programming
  • 渗透作业3
  • Kafka Streams 并行处理机制深度解析:任务(Task)与流线程(Stream Threads)的协同设计
  • kafka快速部署、集成、调优
  • 超越 ChatGPT:智能体崛起,开启全自主 AI 时代
  • 中英混合的语音识别XPhoneBERT 监督的音频到音素的编码器结合 f0 特征LID
  • 阿里云微服务引擎 MSE 及 API 网关 2025 年 7 月产品动态
  • 单变量单步时序预测:CNN-LSTM卷积神经网络结合长短期记忆神经网络
  • MybatisPlus如何用wrapper语句灵活连接多查询条件
  • SpringBoot+LangChain4j解析pdf文档,不使用默认解析器