UnityShader 遮挡部分渲染为半透明Shader

UnityShader 遮挡半透明Shader

//渲染被遮挡部分的Pass
pass{
	blend SrcAlpha OneMinusSrcAlpha
	ZTest greater   // 把被遮住的部分的深度值写入深度缓存,和平时情况正好相反
	Zwrite ON   //开启深度写入
	frag{
		fixed4 col=fixed4(1,0,0,0.5);
	}
}


//渲染没有被遮挡部分的Pass
pass{
	//blend SrcAlpha OneMinusSrcAlpha   //不需要混合
	ZTest LEqual   //小于等于
	Zwrite OFF   //关闭深度写入
	frag{
			fixed4 col=fixed4(1,1,0,1);
		}
}


//也可以这样实现,效果是一样的
pass{
	//blend SrcAlpha OneMinusSrcAlpha   //不需要混合
	ZTest Less 
	Zwrite ON 
	frag{
			fixed4 col=fixed4(1,1,0,1);
		}
}

问题:如果遮挡我们的物体本身是透明物体, 由于透明物体,没有深度写入,因此遮挡部分没有渲染为半透明, 问题是, 在和没有深度写入的半透明物体如何进行深度比较?

Camera.SetReplacementShader

//zclShader/Replacement.Shader 置换透明shader

	SubShader{
		Tags{ "RenderType"="Transparent"
	}

    struct v2f{
    	float4 vertex:POSITION;
    	float2 depth:TEXCOORD0;
    }

	v2f vert(appdata_base v){
		v2f o;
		o.vertex=  UnityObjectToClipPos(v.vertex);
		o.depth=o.vertex.zw;
		return o;
	}


	fixed4 frag(v2f i):SV_Target{
		float depth=i.depth.x/i.depth.y;
		depth=Linear01Depth(depth);
		fixed4 col=(depth,0,0,0);
		return col;
	}

public class ReplaceMentShader:MonoBehaviour{
	void Start(){
		Camera.main.SetReplacementShader(Shader.Find("zclShader/Replacement"),"renderType")
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值