UnityShader太空中的大气层效果

原创 2017年04月21日 14:04:20
Shader "Custom/Atmosphere Glow"
{
	Properties
	{
		//大气层的颜色
		_AtmoColor("Glow Color", Color) = (1,1,1,1)

		//大气层反射效果的强化量
		_InnterRingFactor("Glow Factor", Float) = 5

		//大气层相对于地表的偏移
		_Offset("Vertex Offset", Float) = 0
	}

	SubShader
	{
		Tags
		{
			"IgnoreProjector" = "True"
			"Queue" = "Transparent"
			"RenderType" = "Transparent"
		}

		Pass
		{
			Blend One One
			AlphaTest Greater 0.1
			ColorMask RGBA
			Cull Back Lighting Off ZWrite Off Fog{ Color(0,0,0,0) }

			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma glsl
			#pragma target 3.0

			uniform float _InnterRingFactor;
			uniform float4 _AtmoColor;
			uniform float _Offset;

			struct VertexInput
			{
				float4 vertex : POSITION;
				float3 normal : NORMAL;
			};

			struct VertexOutput
			{
				float4 pos : SV_POSITION;
				float4 posWorld : TEXCOORD0;
				float3 normalDir : TEXCOORD1;
			};

			VertexOutput vert(VertexInput v)
			{
				VertexOutput o;

				//获得顶点的发现方向
				o.normalDir = normalize(mul(unity_ObjectToWorld,float4(v.normal, 0)).xyz);
				
				//对原来的顶点进行偏移
				v.vertex.xyz += (_Offset*v.normal);

				//在世界中的顶点信息
				o.posWorld = mul(unity_ObjectToWorld, v.vertex);
				
				//转换后得到偏移后的顶点信息
				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
				return o;
			}

			float4 frag(VertexOutput i) : COLOR
			{
				//视角方向
				float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);
				//项目里没有使用光源,shader中模拟(0,0,0)点为太阳光照(点光源)
				float3 lightDirection = normalize((0,0,0) - i.posWorld.xyz);

				float ndl = dot(i.normalDir, lightDirection);
				float ndv = dot(i.normalDir, viewDirection);

				//实现的效果为内侧描边
				//这里当ndv为正数时,指数越大,效果越小,ndv为负数时1-ndv为大于1的数,指数越大,效果越强
				float3 innerRing = saturate(_AtmoColor.xyz * pow(1 - ndv,_InnterRingFactor)) ;
				//光源方向参与到运算中
				float3 finalColor = saturate(pow(ndl + max(0.2, dot(-lightDirection, viewDirection)), 3)) * (innerRing * 2) ;

				return float4(finalColor, 1);
			}
		ENDCG
		}
	}
}


效果对比如下:




版权声明:Hello光头原创,欢迎交流拍砖扔鸡蛋,qq:1009570451 https://blog.csdn.net/u010133610/article/details/70314105

Unity官方实例教程 Space Shooter(太空射击游戏)

Space Shooter 太空射击 传送门 Unity官方实例教程 Space Shooter(一) Unity官方实例教程 Space Shooter(二) Unity官方实例教程...
  • u010164190
  • u010164190
  • 2017年04月11日 14:33
  • 3794

unity3d shader ar任意门(传送门)

通道遮罩 ColorMask ColorMask可以让我们制定渲染结果的输出通道,而不是通常情况下的RGBA这4个通道全部写入。可选参数是 RGBA 的任意组合以及 0, 这将意味着不会写入到任何通...
  • luoyikun
  • luoyikun
  • 2018年03月14日 21:58
  • 103

Unity Shader中各种空间及变换方法

前几天尝试写一个传送门的shader,发现自己对坐标之间的变换掌握的不够熟练,趁着这阵子想整理shader相关的知识点,先把各种空间及之间转换整理一下。 1 模型空间-世界空间-观察空间-裁剪空间建模...
  • zhou8jie
  • zhou8jie
  • 2017年12月07日 14:07
  • 281

Unity3d使用Meth实现温度云图

  • 2015年02月15日 09:19
  • 6KB
  • 下载

unity heatmap 热度图的颜色获取

public Texture2D heatmapTex; //标准化的值, 0-1 [Range(0, 1f)] public float givenValue = 0f; public Co...
  • Isveia
  • Isveia
  • 2017年05月18日 10:37
  • 699

Unity3d绘制标量场云图/Contour Map/Fringe

最近遇到个需求,就是用Unity来展示空间内的物理量,需要绘制标量场的云图。 网上找了找别人有的方案是写shader,网友御雪飞舞给我提供的方案是动态生成纹理图片,这两个方案应用前提是物理场可以由简单...
  • nichongben
  • nichongben
  • 2017年10月30日 15:56
  • 274

unity3d 温度云图shader

项目中用到关于温度云图效果,但是本人对shader
  • dulgao
  • dulgao
  • 2014年08月21日 16:35
  • 3497

unity的温度云图实现

最近在做一个展示项目 需要展示空间内的温度云图 在网络搜索一番 得到一枚shader 但是并不能满足需求  所以借鉴其算法 进行程序方面的实现 达到预期效果 PS:并非此shader不好,...
  • x100568
  • x100568
  • 2016年04月22日 12:16
  • 1874

Unity网格编程篇(三) 温度图、热力图

前言 在工业可视化的项目中,我们还会经常遇到一个需求,就是显示某个设备的温度信息,或者是显示一间房间的温度信息,这里我们就需要用到一个组件叫温度图/热力图。需要实现一个温度图又一次需要用到我们的网...
  • qq_29579137
  • qq_29579137
  • 2017年09月05日 18:06
  • 2639

Unity Shader-热空气扭曲效果

简介 千等万等终于等到了《耻辱2》打折,本以为可以爽一发了,然而各种出问题,先是steam下载速度奇慢无比,下了三天晚上好不容易下完的游戏,第一次打开给弹了个3D11CreateDeviceAnd...
  • puppet_master
  • puppet_master
  • 2017年05月03日 23:19
  • 6605
收藏助手
不良信息举报
您举报文章:UnityShader太空中的大气层效果
举报原因:
原因补充:

(最多只允许输入30个字)