2.转动的地球shader

原理很简单,根据时间对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





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值