первое с чем столкнулся - нет мультипасса .. так что придётся создавать 2 одинаковых шарика, на 1 кидать матерал планеты на 2й материал атмосферы...
Шейдер долго не хотел работать так как я этого хотел, поэтому там могут быть небольшие отступления от источника...
сама планета
Синтаксис:
Используется glsl
Shader "Planet"
{
Properties
{
_MainTex("Texture (RGB)", 2D) = "black" {}
_Color("Color", Color) = (0.5, 0.5, 0.5, 1)
_AtmoColor("Atmosphere Color", Color) = (0.5, 0.5, 1.0, 1)
_FalloffPlanet("Falloff Planet", Float) = 5
_TransparencyPlanet("Transparency Planet", Float) = 2
}
SubShader
{
Tags { "RenderType" = "Opaque" "IgnoreProjector"="True" }
Cull Back
CGPROGRAM
#pragma surface surf Lambert vertex:vert
uniform float4 _Color;
uniform float4 _AtmoColor;
uniform float _FalloffPlanet;
uniform float _TransparencyPlanet;
struct Input {
float2 uv_MainTex;
float3 norm;
float3 vDir;
};
void vert (inout appdata_full v, out Input o) {
o.norm = v.normal.xyz;
o.vDir = ObjSpaceViewDir( v.vertex );
}
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o) {
float3 normal = normalize(IN.norm);
float3 view = normalize(IN.vDir);
float4 atmo = _AtmoColor;
atmo.a = pow(1.0-saturate(dot(view, normal)), _FalloffPlanet) * _TransparencyPlanet;
float3 diffuse = tex2D (_MainTex, IN.uv_MainTex).rgb * _Color;
o.Albedo = lerp(diffuse, atmo.rgb, atmo.a);
}
ENDCG
}
FallBack "Diffuse"
}
{
Properties
{
_MainTex("Texture (RGB)", 2D) = "black" {}
_Color("Color", Color) = (0.5, 0.5, 0.5, 1)
_AtmoColor("Atmosphere Color", Color) = (0.5, 0.5, 1.0, 1)
_FalloffPlanet("Falloff Planet", Float) = 5
_TransparencyPlanet("Transparency Planet", Float) = 2
}
SubShader
{
Tags { "RenderType" = "Opaque" "IgnoreProjector"="True" }
Cull Back
CGPROGRAM
#pragma surface surf Lambert vertex:vert
uniform float4 _Color;
uniform float4 _AtmoColor;
uniform float _FalloffPlanet;
uniform float _TransparencyPlanet;
struct Input {
float2 uv_MainTex;
float3 norm;
float3 vDir;
};
void vert (inout appdata_full v, out Input o) {
o.norm = v.normal.xyz;
o.vDir = ObjSpaceViewDir( v.vertex );
}
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o) {
float3 normal = normalize(IN.norm);
float3 view = normalize(IN.vDir);
float4 atmo = _AtmoColor;
atmo.a = pow(1.0-saturate(dot(view, normal)), _FalloffPlanet) * _TransparencyPlanet;
float3 diffuse = tex2D (_MainTex, IN.uv_MainTex).rgb * _Color;
o.Albedo = lerp(diffuse, atmo.rgb, atmo.a);
}
ENDCG
}
FallBack "Diffuse"
}
атмосфера
Синтаксис:
Используется glsl
Shader "Atmosphere"
{
Properties
{
_AtmoColor("Atmosphere Color", Color) = (0.5, 0.5, 1.0, 1)
_Size("Size", Float) = 0.1
_Falloff("Falloff", Float) = 5
_Transparency("Transparency", Float) = 15
}
SubShader
{
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType" = "Transparent" }
Cull Front
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma surface surf Atmosphere alpha vertex:vert
half4 LightingAtmosphere (SurfaceOutput s, half3 lightDir, half atten) {
half4 c = float4 ( s.Albedo, 0.0 );
return c;
}
uniform float4 _AtmoColor;
uniform float _Size;
uniform float _Falloff;
uniform float _Transparency;
struct Input {
float3 norm;
float3 lDir;
float3 vDir;
};
inline float3 _invObjSpaceViewDir( in float4 v )
{
float3 objSpaceCameraPos = mul(_World2Object, float4(_WorldSpaceCameraPos.xyz, 1)).xyz * unity_Scale.w;
return v.xyz - objSpaceCameraPos;
}
void vert (inout appdata_full v, out Input o) {
v.vertex.xyz += v.normal * _Size;
o.norm = v.normal.xyz;
o.lDir = ObjSpaceLightDir( v.vertex );
o.vDir = _invObjSpaceViewDir( v.vertex );
}
void surf (Input IN, inout SurfaceOutput o) {
float3 normal = normalize (IN.norm);
float3 light = normalize(IN.lDir);
float3 view = normalize(IN.vDir);
float temp = pow(saturate(dot(view, normal)), _Falloff) * _Transparency * dot (light, normal);
o.Albedo = _AtmoColor.rgb;
o.Alpha = temp;
}
ENDCG
}
FallBack "None"
}
{
Properties
{
_AtmoColor("Atmosphere Color", Color) = (0.5, 0.5, 1.0, 1)
_Size("Size", Float) = 0.1
_Falloff("Falloff", Float) = 5
_Transparency("Transparency", Float) = 15
}
SubShader
{
Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType" = "Transparent" }
Cull Front
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma surface surf Atmosphere alpha vertex:vert
half4 LightingAtmosphere (SurfaceOutput s, half3 lightDir, half atten) {
half4 c = float4 ( s.Albedo, 0.0 );
return c;
}
uniform float4 _AtmoColor;
uniform float _Size;
uniform float _Falloff;
uniform float _Transparency;
struct Input {
float3 norm;
float3 lDir;
float3 vDir;
};
inline float3 _invObjSpaceViewDir( in float4 v )
{
float3 objSpaceCameraPos = mul(_World2Object, float4(_WorldSpaceCameraPos.xyz, 1)).xyz * unity_Scale.w;
return v.xyz - objSpaceCameraPos;
}
void vert (inout appdata_full v, out Input o) {
v.vertex.xyz += v.normal * _Size;
o.norm = v.normal.xyz;
o.lDir = ObjSpaceLightDir( v.vertex );
o.vDir = _invObjSpaceViewDir( v.vertex );
}
void surf (Input IN, inout SurfaceOutput o) {
float3 normal = normalize (IN.norm);
float3 light = normalize(IN.lDir);
float3 view = normalize(IN.vDir);
float temp = pow(saturate(dot(view, normal)), _Falloff) * _Transparency * dot (light, normal);
o.Albedo = _AtmoColor.rgb;
o.Alpha = temp;
}
ENDCG
}
FallBack "None"
}
впринципе мне нравится как он работает ... только смущает что картинка в редакторе отличается от картинки в запущенном приложении (сдаётся мне что в редакторе насильно добавляется лишний источник света один-другой)