2.转动的地球shader
2016-06-30 17:33
375 查看
原理很简单,根据时间对uv中的x轴进行位移,对于地面和云层,取不同的移动速度,分别计算对应的uv坐标,再根据uv坐标从地面和云层的纹理中分别取出对应的值,最后把两者用lerp函数进行混合作为最终结果。
下边的代码包含两个版本,一个是vertex fragment shader,是不带光照的,一个是surface shader版本,带Lambert光照,运行时场景里加上光照才会显得很明亮
不带光照的Vertext Fragment版本:
最后附上工程文件:http://download.csdn.net/detail/yinfourever/9564149
下边的代码包含两个版本,一个是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实现多点触控代码
- 在Unity中实现动画的正反播放代码
- Unity UGUI教程之实现滑页效果
- unity实现摄像头跟随
- Unity3D上路_01-2D太空射击游戏
- Unity3D上路_02-第一视角射击游戏
- Unity3D上路_03-塔防游戏
- Unity3D上路_04-基础资源介绍
- Unity3D上路_05-网络相关
- Unity3D-5.3.5发布VR项目到Android
- unity 新UI草稿
- [软件资讯]Unity已支持将3D游戏导出成Flash
- ShaderLab: Pass
- Unity 武器拖尾效果
- unity常见问题之20题
- 反编译ARB program to GLSL shader日记
- Unity3D动画存储插件
- unity 赛车相机跟随物体移动
- uLua中遇到的问题
- Unity3d 协程、调用函数、委托