Shader "Custom/RaymarchedCapsuleWorldSpace"
_MainTex ("Texture", 2D) = "white" {}
_CapsuleLength ("Capsule Length", Float) = 1.0
_CapsuleWidth ("Capsule Width", Float) = 0.2
_SpecularColor ("Specular Color", Color) = (1.0, 1.0, 1.0, 1.0)
_Shininess ("Shininess", Float) = 32.0
_RimColor ("Rim Color", Color) = (0.5, 0.5, 0.5, 1.0)
_RimPower ("Rim Power", Float) = 2.0
Tags { "RenderType"="Opaque" }
float4 vertex : POSITION;
float4 vertex : SV_POSITION;
float3 worldPos : TEXCOORD1;
o.vertex = UnityObjectToClipPos(v.vertex);
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
float sdCapsule(float3 p, float3 a, float3 b, float r)
float3 pa = p - a, ba = b - a;
float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);
return length(pa - ba * h) - r;
float3 a = float3(-_CapsuleLength / 2.0, 0.0, 0.0);
float3 b = float3(_CapsuleLength / 2.0, 0.0, 0.0);
return sdCapsule(p, a, b, _CapsuleWidth / 2.0);
float3 getNormal(float3 p)
map(p + float3(d, 0.0, 0.0)) - map(p - float3(d, 0.0, 0.0)),
map(p + float3(0.0, d, 0.0)) - map(p - float3(0.0, d, 0.0)),
map(p + float3(0.0, 0.0, d)) - map(p - float3(0.0, 0.0, d))
float rayMarch(float3 ro, float3 rd)
for (int i = 0; i < 100; i++)
fixed4 frag (v2f i) : SV_Target
float2 uv = i.uv * 2.0 - 1.0;
float3 rd = normalize(float3(uv, 1.0));
float d = rayMarch(ro, rd);
float3 normal = getNormal(p);
float3 lightDir = normalize(_LightDirection.xyz);
float3 viewDir = normalize(ro - p);
float diff = max(dot(normal, lightDir), 0.0);
float3 reflectDir = reflect(-lightDir, normal);
float spec = pow(max(dot(viewDir, reflectDir), 0.0), _Shininess);
fixed4 specular = spec * _SpecularColor;
float rim = pow(1.0 - max(dot(viewDir, normal), 0.0), _RimPower);
fixed4 rimLight = rim * _RimColor;
fixed4 col = diff * fixed4(1.0, 0.5, 0.2, 1.0) + specular + rimLight;
col = fixed4(0.0, 0.0, 0.0, 1.0);