summaryrefslogtreecommitdiffstats
path: root/custom31.cginc
diff options
context:
space:
mode:
Diffstat (limited to 'custom31.cginc')
-rw-r--r--custom31.cginc54
1 files changed, 54 insertions, 0 deletions
diff --git a/custom31.cginc b/custom31.cginc
new file mode 100644
index 0000000..6f29403
--- /dev/null
+++ b/custom31.cginc
@@ -0,0 +1,54 @@
+#ifndef __CUSTOM31_INC
+#define __CUSTOM31_INC
+
+#include "globals.cginc"
+#include "interpolators.cginc"
+
+float map(float3 p) {
+ return length(p) - 0.1;
+}
+
+void apply_custom31_world(v2f i, inout Pbr pbr, inout float3 normal_tangent) {
+#if defined(_CUSTOM31_WORLD)
+ // We will raymarch in (tangent, binormal, normal) coordinates.
+ // Make an expanded homogeneous tbn matrix to support moving back and forth.
+ // This first incarnation moves from world to tangent.
+ float4x4 tbn = float4x4(
+ pbr.tbn[0], 0,
+ pbr.tbn[1], 0,
+ pbr.tbn[2], 0,
+ 0, 0, 0, 1);
+ tbn = mul(tbn, unity_WorldToObject);
+
+ float3 ro = mul(tbn, float4(i.worldPos, 1));
+ float3 rd = normalize(mul((float3x3) tbn, i.worldPos - _WorldSpaceCameraPos));
+
+ float d_acc = 0;
+ float d;
+ const float MIN_DIST = 1e-3;
+ const float MAX_DIST = 1;
+ [loop]
+ for (uint ii = 0; ii < 10; ++ii) {
+ float3 p = ro + rd * d_acc;
+ d = map(p);
+ d_acc += d;
+ if (d < MIN_DIST) {
+ break;
+ }
+ if (d > MAX_DIST) {
+ break;
+ }
+ }
+
+ if (d < MIN_DIST) {
+ pbr.albedo.xyz = 1;
+ } else {
+ pbr.albedo.xyz = 0;
+ }
+
+ float3 p = ro + rd * d_acc;
+ p = mul(float4(p, 1), tbn);
+#endif
+}
+
+#endif // __CUSTOM31_INC