栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

Unity VR开发中UI始终优先渲染不被物体遮挡

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity VR开发中UI始终优先渲染不被物体遮挡

Unity VR开发中UI始终优先渲染不被物体遮挡

在用Vive开发VR的时候,3DUI很容易被场景中的物体遮挡,解决办法是使用一个Shader:Overlay.shader,这个shader很好找,很多博客里都有源码。我只说shader的使用:1.新建一个material。2.将Overlay.shader拖放到新建的material中。3.将这个新建的material放到Image、RawImage、Text或者其他的要优先显示的UGUI上。(是Image、RawImage、Text组件的material,是组件的material,不是所在的Gameobject的Material)。
————————————————

```csharp
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 = mul(UNITY_MATRIX_MVP, 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
		}
	}
}
版权声明:本文为CSDN博主「kuilaurence」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kuilaurence/article/details/89447398

以上shader可以解决UI在所有物体上显示不被遮挡的问题。但是会有个问题,就是需要每一个Image 、RawImage或者Text组件一一替换shader,未免有点麻烦。怎么一次性都自动替换呢?
其实每个组件的Material都继承Graphic.defaultGraphicMaterial。所以解决就有思路了:
1、在场景中的物体上挂上脚本:


using UnityEngine;
/// 
/// 设置canvas的默认材质球(Image上的也是一样),使ui渲染在模型的前面。
/// 
public class SetCanvasDefaultMaterial : MonoBehaviour
{

    public Shader overay;
    private void Awake()
    {
        UnityEngine.UI.Graphic.defaultGraphicMaterial.shader = overay;
       // UnityEngine.UI.Graphic.defaultGraphicMaterial.shader = Shader.Find("UI/Overlay");//可能shader没有引用,导致shader不会被打入包内,导致Find不到。
    }
}

这样就大功告成了。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/901682.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号