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

相关文章推荐

UV动画:UV映射 + UV旋转 + UV偏移 实现 太空旅行、烟云内旋,旋涡效果

Uv的 旋转 偏移 拉伸操作的组合可以实现非常多的效果。 先来几张普通的纹理: 下边是效果图: 效...

[Shader] UnityShader系列---灰白效果

支持 NGUI的 UIPanel 的SoftClip无图无真相修改 Unlit - Transparent Colored.shader 如下:Shader "Unlit/Transparent ...

[UnityShader3]局部动态效果

参考链接:http://blog.csdn.net/stalendp/article/details/30989295 效果图: Shader "Custom/Lightn...
  • lyh916
  • lyh916
  • 2016年07月14日 16:04
  • 1677

[UnityShader3]2D描边效果

参考链接: http://inpla.net/thread-6502-1-1.html http://www.jianshu.com/p/1d9d439c28fa 1. ...
  • lyh916
  • lyh916
  • 2016年05月24日 10:08
  • 3138

[UnityShader3]边缘光流动效果

参考链接:http://liweizhaolili.blog.163.com/blog/static/162307442012726111843408/ 效果图: 1.首先,导入unity自带...
  • lyh916
  • lyh916
  • 2016年07月06日 09:38
  • 3110

UnityShader入门精要学习笔记(十):透明效果-上部分

1.Unity渲染顺序2.透明度测试片元着色器中的剪裁函数clip函数:void clip(float x) 、void clip(float2 x)、void clip(float3 x)、void...

[UnityShader3]光之翼效果

参考链接:http://liweizhaolili.blog.163.com/blog/static/1623074420140239329304/ 效果图(这里我使用的是Quad,如果是扇形的话...
  • lyh916
  • lyh916
  • 2016年07月05日 13:48
  • 907

[UnityShader3]转圈与冷却效果

参考链接:http://blog.csdn.net/stalendp/article/details/22687059 一.转圈效果 效果图: 如何实现一个圆绕中心点运动呢?原理很简单,就...
  • lyh916
  • lyh916
  • 2016年07月12日 15:46
  • 1034

[UnityShader3]圆角与流光效果

参考链接: http://blog.csdn.net/mobanchengshuang/article/details/38731035?utm_source=tuicool&utm_medium=...
  • lyh916
  • lyh916
  • 2016年07月13日 16:06
  • 1319

UnityShader之建立高光效果

本来特效插件都找好了,结果看到youtube上有个大神做的塔防游戏,很好的idea而且看了他的代码,感觉挺好的,,比原先自己写塔防的时候要强的多, 面向对象的三大特性基本都涉及了,代码的扩展性也很强,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UnityShader太空中的大气层效果
举报原因:
原因补充:

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