UnityShader太空中的大气层效果
生活随笔
收集整理的這篇文章主要介紹了
UnityShader太空中的大气层效果
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Shader "Custom/Atmosphere Glow"
{Properties{//大氣層的顏色_AtmoColor("Glow Color", Color) = (1,1,1,1)//大氣層反射效果的強(qiáng)化量_InnterRingFactor("Glow Factor", Float) = 5//大氣層相對(duì)于地表的偏移_Offset("Vertex Offset", Float) = 0}SubShader{Tags{"IgnoreProjector" = "True""Queue" = "Transparent""RenderType" = "Transparent"}Pass{Blend One OneAlphaTest Greater 0.1ColorMask RGBACull Back Lighting Off ZWrite Off Fog{ Color(0,0,0,0) }CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma glsl#pragma target 3.0uniform 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;//獲得頂點(diǎn)的發(fā)現(xiàn)方向o.normalDir = normalize(mul(unity_ObjectToWorld,float4(v.normal, 0)).xyz);//對(duì)原來的頂點(diǎn)進(jìn)行偏移v.vertex.xyz += (_Offset*v.normal);//在世界中的頂點(diǎn)信息o.posWorld = mul(unity_ObjectToWorld, v.vertex);//轉(zhuǎn)換后得到偏移后的頂點(diǎn)信息o.pos = mul(UNITY_MATRIX_MVP, v.vertex);return o;}float4 frag(VertexOutput i) : COLOR{//視角方向float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.posWorld.xyz);//項(xiàng)目里沒有使用光源,shader中模擬(0,0,0)點(diǎn)為太陽光照(點(diǎn)光源)float3 lightDirection = normalize((0,0,0) - i.posWorld.xyz);float ndl = dot(i.normalDir, lightDirection);float ndv = dot(i.normalDir, viewDirection);//實(shí)現(xiàn)的效果為內(nèi)側(cè)描邊//這里當(dāng)ndv為正數(shù)時(shí),指數(shù)越大,效果越小,ndv為負(fù)數(shù)時(shí)1-ndv為大于1的數(shù),指數(shù)越大,效果越強(qiáng)float3 innerRing = saturate(_AtmoColor.xyz * pow(1 - ndv,_InnterRingFactor)) ;//光源方向參與到運(yùn)算中float3 finalColor = saturate(pow(ndl + max(0.2, dot(-lightDirection, viewDirection)), 3)) * (innerRing * 2) ;return float4(finalColor, 1);}ENDCG}}
}
效果對(duì)比如下:
總結(jié)
以上是生活随笔為你收集整理的UnityShader太空中的大气层效果的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 推荐8个炫酷的 Python 装饰器!
- 下一篇: 地球大气层简介与垂直分层