首页 > 代码库 > Shader-应用V&F实现透明材质

Shader-应用V&F实现透明材质

看到风宇冲实现的地球很帅。他写的这个程序很精妙,将地球和云的颜色做一个插值,作为此像素的颜色值,很妙。先膜拜一下大神嘛!

http://blog.sina.com.cn/s/blog_471132920101d6xb.html

不过,我今天写的shader也是实现相同的效果,咱的思路就很常规:地球作为不透明物体,先渲染。云层作为透明体后渲染。废话不多说开始!

Earth.shader

Shader "Custom/Earth" 
{
	Properties 
	{
		_MainTex ("Texture", 2D) = "white" { }
	}
	
	SubShader 
	{
		Tags
		{
			"Queue" = "Geometry" 
			"RenderType"="Opaque"
		}
		
		Pass 
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"
			
			sampler2D _MainTex;
		
			struct v2f 
			{
				float4  pos : SV_POSITION;
				float2  uv : TEXCOORD0;
			};
		
			float4 _MainTex_ST;
		
			v2f vert (appdata_base v)
			{
				v2f o;
				// 视口上的位置
				o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
				// 贴图纹理坐标
				o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
				return o;
			}
		
			half4 frag (v2f i) : COLOR
			{
				// 获得地球贴图的uv x即横向在动
				float u = i.uv.x + -0.1*_Time;
				float2 x=float2(u , i.uv.y);
				half4 texcol = tex2D (_MainTex, x);
				return texcol;
			}
			ENDCG
		}
	}
}

Cloud.shader

Shader "Custom/Cloud" 
{
	Properties 
	{
		_MainTex ("Texture", 2D) = "white" { }
	}
	
	SubShader 
	{
		Tags
		{ 
            "Queue"="Transparent"  
            "RenderType"="Transparent" 
		}
		
		Pass 
		{ 
            Blend SrcAlpha OneMinusSrcAlpha 
			
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			#include "UnityCG.cginc"
			
			sampler2D _MainTex;
			
			struct v2f 
			{
				float4  pos : SV_POSITION;
				float2  uv : TEXCOORD0;		
			};
		
			float4 _MainTex_ST;
		
			v2f vert (appdata_base v)
			{
				v2f o;
				// 视口上的位置
				o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
				// 贴图纹理坐标
				o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
				
				return o;
			}
		
			half4 frag (v2f i) : COLOR
			{
				// 获得地球贴图的uv x即横向在动
				float u = i.uv.x + -0.2*_Time;
				float2 x = float2 (u, i.uv.y);
				half4 texcol = tex2D (_MainTex, x);
				texcol = float4(1, 1, 1, 0) * (texcol.x);
				
				if (texcol.x + texcol.y + texcol.z > 0.95)
				{
					texcol = half4(texcol.xyz, 0.5);
				}
			
				return texcol;
			}
			ENDCG
		}
	}
}

ok之所以,texcol这一步,是因为给的图是多彩的,像热成像图。经过了

texcol = float4(1, 1, 1, 0) * (texcol.x);
转化成了黑白图,其中白色为云效果。

然后再判断一下,即可。


思路上是没问题的,可是当我写出大部分代码的时候,总是不出效果。

技术分享


怎样在0没有云的地方透明。后来我加入了Blend SrcAlpha OneMinusSrcAlpha  就出了效果

技术分享

ok。剩下的 就是百度他的作用了,这就不是我的工作了。哈哈

http://download.csdn.net/detail/lihuozhiling/8365965


Shader-应用V&F实现透明材质