Shader "CrispyPin/LibGarbageExample" { Properties { [Header(Raymarcher Properties)] _MaxSteps ("Max steps", Int) = 128 _MaxDist ("Max distance", Float) = 128 _SurfDist ("Surface distance threshold", Range(0.00001, 0.05)) = 0.001 } SubShader { Tags { "RenderType"="Opaque" } Cull Front LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag int _MaxSteps; #define MAX_STEPS _MaxSteps float _MaxDist; #define MAX_DIST _MaxDist float _SurfDist; #define SURF_DIST _SurfDist #define REFLECTIONS 1 #define DISTANCE_FN main_dist #define MATERIAL_FN main_mat #define LIGHT_FN lighting // #define DISABLE_DEPTH // #define DISCARD_ON_MISS // #define USE_WORLD_SPACE #define SCENE_SCALE 0.05 #include "libgarbage.cginc" float main_dist(float3 p) { float d = sdPlaneY(p, 0); d = qIntersect(d, sdSphere(p, 9), 0.5); d = qUnion(d, sdSphere(p - float3(0, 2, 0), 2)); d = qUnion(d, sdTorus(rotX(p, _Time * 40 + UNITY_PI / 2), 5, 0.5), 0.5); d = qUnion(d, sdTorus(rotZ(p, _Time * 40 + UNITY_PI / 2), 5, 0.5), 0.5); d = qUnion(d, sdTorus(rotX(p, _Time * 40), 5, 0.5), 0.5); d = qUnion(d, sdTorus(rotZ(p, _Time * 40), 5, 0.5), 0.5); // small spheres float3 p2 = abs(rotY(p, -20 * _Time)) - float3(1.5, sin(_Time.y * 5) + 1, 1.5); d = qUnion(d, sdSphere(p2, 0.7), 0.2); return d; } SurfacePoint main_mat(float3 p) { float3 p2 = repXYZ(p, 2); return mSphere(p2, 0.5, mat(clamp(abs(p), 0, 1), 0.1)); } float3 lighting(Ray ray) { float3 sun_dir = normalize(float3(1, 0.5, 0)); if (ray.missed) return float3(0.15, 0.25, 0.3); float3 col = 0; col = ray.mat.col * clamp(dot(ray.normal, sun_dir),0.01,1); return col; } ENDCG } } }