unity ui被模型遮挡

本文介绍了如何在Unity中使用worldspace渲染模式的Canvas避免被其他物体遮挡,通过应用官方提供的UI/Overlayshader并将其材质应用于特定UI元素,确保其始终位于场景前方。
部署运行你感兴趣的模型镜像

将Canvas的render mode设置为world space,因为UI是直接放在了场景里面,很容易被其他物体挡住,Unity官方的一个VR例子中给出了一个shader的解决方案,将如下的shader挂在材质上,并将这个材质赋予需要总是显示在所有物体前面的UI控件上,就可以解决这个问题。

Shader "UI/Overlay"
{
	Properties
	{
		[PerRendererData] _MainTex("Font Texture", 2D) = "white" {}
		_Color("Tint", Color) = (1,1,1,1)
		_StencilComp("Stencil Comparison", Float) = 8
		_Stencil("Stencil ID", Float) = 0
		_StencilOp("Stencil Operation", Float) = 0
		_StencilWriteMask("Stencil Write Mask", Float) = 255
		_StencilReadMask("Stencil Read Mask", Float) = 255
		_ColorMask("Color Mask", Float) = 15
	}

		SubShader
		{
			LOD 100

			Tags
			{
				"Queue" = "Transparent"
				"IgnoreProjector" = "True"
				"RenderType" = "Transparent"
				"PreviewType" = "Plane"
				"CanUseSpriteAtlas" = "True"
			}

			Stencil
			{
				Ref[_Stencil]
				Comp[_StencilComp]
				Pass[_StencilOp]
				ReadMask[_StencilReadMask]
				WriteMask[_StencilWriteMask]
			}

			Cull Off
			Lighting Off
			ZWrite Off
			ZTest Always
			Offset -1, -1
			Blend SrcAlpha OneMinusSrcAlpha
			ColorMask[_ColorMask]

			Pass
			{
				CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "UnityUI.cginc"

				struct appdata_t
				{
					float4 vertex : POSITION;
					float2 texcoord : TEXCOORD0;
					float4 color : COLOR;
				};

				struct v2f
				{
					float4 vertex : SV_POSITION;
					half2 texcoord : TEXCOORD0;
					fixed4 color : COLOR;
				};

				sampler2D _MainTex;
				float4 _MainTex_ST;
				fixed4 _Color;
				fixed4 _TextureSampleAdd;

				v2f vert(appdata_t v)
				{
					v2f o;
					o.vertex = UnityObjectToClipPos(v.vertex);
					o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
					o.color = v.color * _Color;
#ifdef UNITY_HALF_TEXEL_OFFSET
					o.vertex.xy += (_ScreenParams.zw - 1.0)*float2(-1,1);
#endif
					return o;
				}

				fixed4 frag(v2f i) : SV_Target
				{
					fixed4 col = (tex2D(_MainTex, i.texcoord) + _TextureSampleAdd) * i.color;
					clip(col.a - 0.01);
					return col;
				}
				ENDCG
			}
		}
}

赋值给下图

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### 解决 Unity 中透明模型遮挡 UI 的方法 在 Unity 中处理透明物体与 UI 遮挡问题时,通常是因为渲染顺序不正确造成的。为了确保 UI 始终显示在最上层,可以调整摄像机设置以及 Shader 属性。 #### 调整摄像机设置 通过修改摄像机的 Culling Mask 和 Depth 来控制哪些图层会被渲染到屏幕上[^1]。对于包含 UI 的场景: - 设置两个不同的 Camera 实体分别负责世界空间对象和 UI 渲染。 - 将用于渲染世界的 Camera 的 `Depth` 设定为较低数值(如0),而专门用来呈现 Canvas 上 UI 元素的那个 Camera 则赋予更高的 `Depth` 数值(比如1)。这样就保证了即使存在半透明的对象也不会干扰到界面上的内容。 #### 修改着色器属性 当涉及到自定义材质或效果时,可能还需要进一步配置所使用的 Shader 文件内的参数以适应特定需求。例如,在 ASE ( Amplify Shader Editor ) 创建的 Shader 中加入 pragma 指令来优化性能并指定合适的渲染队列: ```csharp #pragma target 3.0 // 确保此片段位于顶点/片元程序之前 Tags { "Queue"="Transparent" } ``` 上述代码段会告诉 Unity 把应用该 Shader 的 MeshRenderer 放入透明渲染路径中,从而按照正确的前后关系绘制出来。 另外一种方式是在 SubShader 或 Pass 内部利用 `ZWrite Off` 关键字关闭深度写入功能,使得这些几何图形不会影响其他后续被渲染的东西;同时配合 `Blend SrcAlpha OneMinusSrcAlpha` 进行标准 alpha-blending 处理。 最后需要注意的是,如果项目里启用了 Post-processing Effects Stack,则要确认其内部各项特效是否会对最终视觉造成额外的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码的小石头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值