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