原理很简单,根据时间对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;// RGBo.Albedo = res.rgb;// 透明度o.Alpha = 1;}ENDCG}
}

带光照的Surface版本 :

不带光照的Vertext Fragment版本:

最后附上工程文件:http://download.csdn.net/detail/yinfourever/9564149

2.转动的地球shader相关推荐

  1. opengl地球贴纹理_一文看懂材质/纹理 Material, Texture, Shading, Shader 的区别

    在计算机图形学和三维设计中,有几个容易混淆的概念.今天我们来一举拿下. 概念整理 可以这么总结: Material 是表现 Shading 的数据集.其他几个概念都是生成这一数据集的资源或者工具. 这 ...

  2. cesium 渲染分析(以太阳为例),实现卫星任务规划中地球赤道平面绘制

    分析太阳的绘制,对绘制赤道和其它天体有很大的启发. 太阳的定义在文件sun.js 中 function Sun() {/*** Determines if the sun will be shown. ...

  3. AR涂涂乐⭐四、 获取截图、赋值给物体,将数据传递给shader

    using System.Collections; using System.Collections.Generic; using UnityEngine;public class ScreenSho ...

  4. 使用UE4创建一个简单真实的地球(一)

    使用UE4创建一个简单真实的地球 准备地球模型Mesh 三角面片:520191 顶点:261067 准备纹理贴图 可以在这里下载地球的纹理贴图:包括白天.夜晚.法线贴图以及云图等. https://w ...

  5. 【实战篇】40 # 如何实现3D地球可视化?

    说明 [跟月影学可视化]学习笔记. 如何实现一个 3D 地球 学习笔记源码实现:https://github.com/kaimo313/visual-learning-demo 整体实现效果如下: 1 ...

  6. OpenglES2.0 for Android:来做个地球吧

    OpenglES2.0 for Android:来做个地球吧 前言 上两节中我们说了纹理映射,也利用纹理给我们的平面图形以及立方体穿上了漂亮的衣服,在继续学习其他知识之前,让我们先来用纹理映射以及我们 ...

  7. Canvas模拟太阳地球月球的运动过程

    先看效果图 代码 package com.test.paintdemo.pathrelate;import android.content.Context; import android.graphi ...

  8. OpenGL ES for Android 绘制旋转的地球

    No 图 No Code,我们先来欣赏下旋转的地球: 是不是很酷炫,要想绘制出上面酷炫的效果需要3个步骤: 计算球体顶点数据 地球纹理贴图 通过MVP矩阵旋转地球 计算球体顶点数据 我们知道OpenG ...

  9. 使用three.js渲染瓦片地球-第一篇

    近期有个需求是想使用自己的3d引擎去渲染地球逻辑,如果从头实现一遍会比较耗费时间,而且后续还要实现倾斜摄影等等,所以打算使用cesium来帮我们做调度然后用自己的3d引擎渲染. 在github上找到了 ...

最新文章

  1. 【避坑】初次接项目的血与泪,扎坑了老
  2. linux内核学习之三:linux中的32位与64位
  3. 《碟中谍4:幽灵协议》蓝光1080P 720P首发!!汤姆克鲁斯主演
  4. 2.Knockout.Js(监控属性Observables)
  5. 隐藏apache版本号的方法
  6. 栈/队列/分块问卷调查反馈——Weak in the Middle,Cutting Plants,最小公倍数
  7. 不带头结点的链表基础操作(初始化,增删改查)
  8. 【转】医学影像技术(中国普通高等学校本科专业)
  9. iis网站服务器响应慢,IIS响应慢
  10. SqlServer中使用Mysql中的limit分页功能
  11. 10条实用简洁的python代码,拿走即用(内附资料)
  12. pytorch下载加载mnist数据集
  13. 二、Vue实例对象及其属性
  14. 计算机内存调用优化,Memory Cleaner——简单好用的Windows内存优化工具
  15. 计算机nas一般指用户,NAS网络存储器·什么是网络服务
  16. 陕西师范大学第七届程序设计竞赛网络同步赛 D ZQ的睡前故事(java)
  17. 使用Unity编写传统ARPG游戏的人物操作方式
  18. 如何通过rancher部署k8s集群
  19. 计算机编程序专业,计算机编程方向专业
  20. 求一个3×3矩阵对角线元素之和。

热门文章

  1. firefox更新后标签没了_时隔三月,奶酪增强版 Chrome Edge 双双更新
  2. python内置作用域_python中的作用域
  3. mysql空事务死锁_mysql空当锁导致死锁_mysql
  4. Task On The Board CodeForces - 1367D(思维)
  5. Aerodynamic CodeForces - 1300D(计算几何判断是否为中心对称图形)
  6. 公共钥匙盒(排序CCF)
  7. 小程序开发学习(2)---.wxml详解篇
  8. bytes转16进制整数 python_Python 十进制转二进制、八进制、十六进制
  9. php sha256hex,crypto/sha256(加密/sha256)
  10. Linux Ubuntu 修改Grub,添加删除启动项,初步辨析Grub文件。