Unity 模型被建筑物遮挡处理(二)(显示模型轮廓)

当模型被建筑物遮挡的时候,如果要显示模型的轮廓时,修改模型的Shader:

Shader "Unlit/MaskShader"
{
	Properties
	{
		[NoScaleoffset]_MainTex ("Texture", 2D) = "white" {}
		_maskColor("MaskColor",Color) = (0,1,0)//轮廓颜色
	}
	
	SubShader
	{
		Tags { "RenderType"="Opaque" "Queue" = "Geometry+100"  }
		
		Pass
		{
			Blend SrcAlpha One
			ZTest Greater
            ZWrite Off

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#pragma multi_compile_fog
			#include "UnityCG.cginc"

			struct MeshData
			{
				float4 vertex : POSITION;
				float2 uv : TEXCOORD0;
				float3 normal : NORMAL;
			};

			struct Interpolator
			{
				float2 uv : TEXCOORD0;
				float4 vertex : SV_POSITION;
				float4 pos : TEXCOORD1;
				float3 normal : NORMAL;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			float4 _maskColor;
			
			Interpolator vert (MeshData v)
			{
				Interpolator o;
				o.vertex = UnityObjectToClipPos(v.vertex);
				o.uv = TRANSFORM_TEX(v.uv, _MainTex);
				o.pos = v.vertex;
				o.normal = v.normal;
				return o;
			}
			
			fixed4 frag (Interpolator i) : SV_Target
			{
				fixed4 col = fixed4(0,0,0,0.1);
				float3 wpos = mul(unity_ObjectToWorld, i.pos).xyz;
				float3 viewDir = UnityWorldSpaceViewDir(wpos);
				viewDir = normalize(viewDir);

				float3 normal = UnityObjectToWorldNormal(i.normal);
				float flag = 1 - saturate(dot(viewDir,normal));
				float br = pow(flag, 2.0);
				col = lerp(col , _maskColor , br);
				return col;
			}
			ENDCG
		}
		
		Pass
		{
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
			
            sampler2D _MainTex;
            float4 _MainTex_ST;
			float _Alpha;

            struct MeshData
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct Interpolator
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            Interpolator vert (MeshData v)
            {
                Interpolator o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            float4 frag (Interpolator i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                return col;
            }
            ENDCG
		}
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Unity显示模型轮廓可以通过使用Shader来实现。可以使用一种称为轮廓着色器(Outline Shader)的特殊着色器来实现这个效果。轮廓着色器可以通过在模型的边缘上绘制一条明亮的线条来突出显示模型轮廓。这可以通过在顶点着色器中计算模型表面法线的变化,并在片段着色器中根据法线变化的大小来绘制轮廓线。通过调整轮廓线的宽度和颜色,可以根据需要来定制轮廓的外观。\[2\] 在Unity中,可以使用Shader Graph来创建自定义的轮廓着色器。Shader Graph是Unity的一个可视化着色器编辑器,它允许开发者通过连接节点来创建和编辑着色器。通过在Shader Graph中添加合适的节点,可以实现模型轮廓显示效果。可以使用顶点位移节点来计算模型表面法线的变化,并使用描边节点来绘制轮廓线。通过调整节点的参数,可以控制轮廓线的宽度和颜色。\[2\] 使用轮廓着色器可以使选中的模型在场景中更加清晰地显示出来,提供更好的用户体验。通过在Unity中使用Shader Graph来创建自定义的轮廓着色器,可以灵活地调整轮廓的外观和效果,以满足项目的需求。\[2\] #### 引用[.reference_title] - *1* *2* *3* [[Unity3D]Unity3D游戏开发之在3D场景中选择物体并显示轮廓效果](https://blog.csdn.net/weixin_33674976/article/details/85631646)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值