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

【Unity Shader】案例之地球云图(二)

一、地球旋转云图   1.1 添加纹理Shader "liulongling/earth" { Properties { _Tex1("地球",2D)="white"{} _Tex2("云图...
  • liulongling
  • liulongling
  • 2016年07月10日 22:29
  • 2969

【Unity Shader】案例之地球云图(二)

一、地球旋转云图   1.1 添加纹理Shader "liulongling/earth" { Properties { _Tex1("地球",2D)="white"{} _Tex2("云图...
  • liulongling
  • liulongling
  • 2016年07月10日 22:29
  • 2969

unity3d shader之实时室外光线散射(大气散射)渲染

散射需要:吸收,内散射,外散射 分为瑞利散射Rayleigh Scattering和米氏散射 Mie Scattering  后面会详细讲解 大气中散射由多种原因产生,微粒,尘埃,水蒸气等等 ...
  • wolf96
  • wolf96
  • 2015年07月30日 09:26
  • 3128

【Unity3D自学记录】实现地球仪般拖拽旋转的效果

01 using UnityEngine; 02 using System.Collections; 03 ...
  • hackdjh
  • hackdjh
  • 2014年07月04日 11:50
  • 2567

shader实例溶解,燃烧效果

游戏中物体腐化消失,燃烧消失时,会有从局部慢慢消失的效果,然后配合一些粒子特效,就能达到非常好的美术效果。 类似效果如下: 注: _DissColor为溶解主色,_AddColor为叠加色,...
  • m0_37283423
  • m0_37283423
  • 2017年04月25日 13:35
  • 723

Unity3D之太空大战一

这是一个简单的太空大战DEMO,整个游戏两个部分,开始游戏界面跟游戏主界面,...
  • kuloveyouwei
  • kuloveyouwei
  • 2014年07月20日 15:53
  • 6564

如何解决谷歌地球不显示卫星影像的问题

谷歌地球不显示卫星地图时,我们通常以以下四种方法进行解决,即更新HOST、重启路由器(或光猫)获得新的外网IP、设置代理服务器和通过VPN翻墙等,这里我们分别对几种方法作出阐述。 一...
  • mrib
  • mrib
  • 2017年07月17日 17:19
  • 798

AndroidUI之三分钟教你实现效果简单大气的Dialog提示框

在项目当中不可以避免会使用一些自定义的提示框,如下图所示: 个人感觉这个还不错,,,全屏显示,,, 下面,让我们一起学习,如何实现当前效果。。。实现思路如下: 1. 首先自定义一个dialog类...
  • u012400885
  • u012400885
  • 2016年04月19日 15:17
  • 618

[菜鸟每天来段CUDA_C]CUDA实现简单热传导动态模拟

本文利用CUDA实现简单二维平面上的热传导模拟。假设有一个矩形房间,将其分成一个网格,在网格中随机散布一些热源,热源有不同的固定温度,然后就可以计算网格中每个单元的温度随时间的变化情况。本文将热传导模...
  • jonny_super
  • jonny_super
  • 2013年12月03日 15:14
  • 1632

Unity3D 粒子系统实现一个简单的爆炸效果

Unity3D 爆炸效果 粒子系统
  • six_sex
  • six_sex
  • 2017年06月04日 09:39
  • 5290
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UnityShader太空中的大气层效果
举报原因:
原因补充:

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