您的位置:首页 > 移动开发 > Unity3D

2.转动的地球shader

2016-06-30 17:33 375 查看
原理很简单,根据时间对uv中的x轴进行位移,对于地面和云层,取不同的移动速度,分别计算对应的uv坐标,再根据uv坐标从地面和云层的纹理中分别取出对应的值,最后把两者用lerp函数进行混合作为最终结果。

下边的代码包含两个版本,一个是vertex fragment shader,是不带光照的,一个是surface shader版本,带Lambert光照,运行时场景里加上光照才会显得很明亮

Shader "Study/2_Earth"
{
Properties
{
_Color("Main Color", Color) = (1,1,1,0.5)
_MainTex("Texture", 2D) = "white" { }  //地面纹理
_Cloud("_Cloud", 2D) = "white" { }		//云层的纹理
_SpeedE("SpeedE", Float) = 0.25			//地面移动速度
_SpeedC("SpeedC", Float) = 0.5			//云层移动速度
}
///vertex fargment shader版本
/*
SubShader
{
Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" }  //其实设为常用的Opaque也是可以的
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

float4 _Color;
sampler2D _MainTex;
sampler2D	_Cloud;
uniform float _SpeedE;
uniform float _SpeedC;

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坐标并取出纹理值
float u = i.uv.x + -_SpeedE * _Time;
float2 uv_tmp = float2(u , i.uv.y);
half4 texcol = tex2D(_MainTex, uv_tmp);
texcol = texcol;
//移动云层uv坐标并取出纹理值
u = i.uv.x + -_SpeedC * _Time;
uv_tmp = float2(u , i.uv.y);
half4 texcol3 = tex2D(_Cloud, uv_tmp);
half4 texcol0 = float4(1,1,1,0) * (texcol3.x);//这步操作是因为使用的图片云层颜色并不是白色
//	混合二者作为最终输出
half4 res = lerp(texcol, texcol0, 0.5);
return res;
}
ENDCG
}
}
*/
///带光照的surface shader版本
SubShader
{
Tags{ "Queue" = "Transparent" "RenderType" = "Transparent" }  //其实设为常用的Opaque也是可以的
CGPROGRAM
#pragma surface surf Lambert

#include "UnityCG.cginc"

float4 _Color;
sampler2D _MainTex;
sampler2D	_Cloud;
uniform float _SpeedE;
uniform float _SpeedC;

// 获取_MainTex的UV信息定义输入结构体
struct Input
{
// 在贴图变量前加上uv表示提取uv值(二维坐标)
float2 uv_MainTex;
};
void surf(Input IN, inout SurfaceOutput o)
{
//移动地面uv坐标并取出纹理值
float u = IN.uv_MainTex.x + -_SpeedE * _Time;
float2 uv_tmp = float2(u, IN.uv_MainTex.y);
half4 texcol = tex2D(_MainTex, uv_tmp);
texcol = texcol;
//移动云层uv坐标并取出纹理值
u = IN.uv_MainTex.x + -_SpeedC * _Time;
uv_tmp = float2(u, IN.uv_MainTex.y);
half4 texcol3 = tex2D(_Cloud, uv_tmp);
half4 texcol0 = float4(1, 1, 1, 0) * (texcol3.x);//这步操作是因为使用的图片云层颜色并不是白色
//	混合二者作为最终输出
half4 res = lerp(texcol, texcol0, 0.5) * _Color;
// RGB
o.Albedo = res.rgb;
// 透明度
o.Alpha = 1;
}
ENDCG
}
}
带光照的Surface版本 :



不带光照的Vertext Fragment版本:



最后附上工程文件:http://download.csdn.net/detail/yinfourever/9564149
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Unity Shader