[UnityShader]Blending

具体的可以查看官方api:http://docs.unity3d.com/Manual/SL-Blend.html

还有一些不错的文章:http://blog.csdn.net/poem_qianmo/article/details/42060963

http://blog.csdn.net/candycat1992/article/details/41599167


Blending主要用于实现半透明效果,类似于玻璃,学习Blending之前,首先要了解源和目标。

源:已经计算过的颜色,形象地说,就是Blending操作之前,经过各种操作计算后的颜色。

[UnityShader]Blending_第1张图片


目标:已经在屏幕的颜色,因为要实现半透明效果,要把渲染队列设为Transparent,这里的"已经在屏幕的颜色"指的是在Transparent之前渲染的像素颜色,其中包含相机的背景颜色,这里可以通过测试来证明一下,看不懂的可以先跳过这个shader。其中赋值给_MainTex的是一个rgb为(1,1,1),a为0.5的tex。

Shader "Custom/NewShader 1" {
	Properties
	{
		_MainTex("Base (RGB)", 2D) = "white" {}
	}
	SubShader
	{
		Tags{ "Queue" = "Transparent" }
		Blend DstColor Zero

		Pass
		{
			SetTexture[_MainTex] {}
		}
	}
	FallBack "Diffuse"
}

比较常用的语句:Blend SrcFactor DstFactor

SrcFactor:源因子

DstFactor:目标因子

两者可以取得值为:

[UnityShader]Blending_第2张图片

经过Blending操作后,最终的颜色=源颜色*SrcFactor+目标颜色*DstFactor,从而达到像玻璃那样的,混合颜色的效果。

以下讲解一下一个极其简单的玻璃shader:

Shader "Custom/NewShader 1" {
	Properties
	{
		_MainTex("Base (RGB)", 2D) = "white" {}
	}
	SubShader
	{
		Tags{ "Queue" = "Transparent" }
		Blend SrcAlpha OneMinusSrcAlpha

		Pass
		{
			SetTexture[_MainTex] {}
		}
	}
	FallBack "Diffuse"
}

效果图:

[UnityShader]Blending_第3张图片

[UnityShader]Blending_第4张图片


可以看到,大方块挡住了红球,但是透过大方块却看到了红球,因为Blending关闭了深度缓存。其中赋值给_MainTex的是一个rgb为(1,1,1),a为0.5的tex。这里我们不想被光照模型影响,所以就不使用表面着色器了。

其中核心就是那个Blending语句了,这里是怎么计算的呢?

结果=(1,1,1)*0.5+(1-0.5)*目标颜色,整理一下就是:灰色+0.5*目标颜色(这里的目标颜色有两种:红球的红色以及相机背景的蓝色),在球的地方,大方块的颜色与红球的颜色进行混合,于是就产生了半透明的效果。


这里我们改变相机的背景颜色为黑色:

[UnityShader]Blending_第5张图片

可以看到这里大方块变成了真正的灰色了。





你可能感兴趣的:(UnityShader)