Aetheria/Assets/Shaders/Asteroid.shader

80 lines
2 KiB
Text
Raw Normal View History

Shader "Aetheria/Asteroid"
{
Properties
{
[NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
}
CGINCLUDE
#pragma multi_compile_instancing
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc" // for UnityObjectToWorldNormal
#include_with_pragmas "Assets/Shaders/Volumetric.cginc"
uniform float _AsteroidVerticalOffset;
struct v2f
{
float2 uv : TEXCOORD0;
half3 ambient : COLOR0;
float4 vertex : SV_POSITION;
};
v2f vert (appdata_base v)
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
float3 worldOrigin = mul(unity_ObjectToWorld, float4(0, 0, 0, 1.0)).xyz;
float3 worldPos = mul(unity_ObjectToWorld, float4(v.vertex.xyz, 1.0)).xyz;
const float2 uv = getUV(worldOrigin.xz);
const float surfaceDisp = tex2Dlod(_NebulaSurfaceHeight, half4(uv, 0, 0)).r;
worldPos.y += _AsteroidVerticalOffset - surfaceDisp;
o.vertex = mul(UNITY_MATRIX_VP, float4(worldPos, 1.0));
o.uv = v.texcoord;
// get vertex normal in world space
half3 worldNormal = UnityObjectToWorldNormal(v.normal);
o.ambient = VolumeSampleColorSimple(worldPos, worldNormal).rgb * 10;
return o;
}
sampler2D _MainTex;
fixed4 frag (v2f i) : SV_Target
{
// sample texture
fixed4 col = tex2D(_MainTex, i.uv);
// multiply by lighting
col.rgb *= i.ambient;
return col;
}
float4 frag_shadow(v2f i) : COLOR
{
SHADOW_CASTER_FRAGMENT(i)
}
ENDCG
SubShader
{
Pass
{
Tags {"LightMode"="ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
Pass
{
Name "ShadowCaster"
Tags { "LightMode" = "ShadowCaster" }
CGPROGRAM
#pragma vertex vert
#pragma fragment frag_shadow
ENDCG
}
}
}