When I tried this about a couple months ago, I made a tiling 3D Worley noise material that saves 256, 256x256 layers to a 4K CanvasRenderTarget2D. I pre-unrolled the loops so that it doesn’t take forever to compile when you make changes.
float scale=nc/tilesize;
float3 sx=x*scale;
float3 p = floor( sx );
float3 f = frac( sx );
float ncti=nc/ti;
float id = 0.;
float2 res = float2( 100.0,100.0 );
float3 dd=float3(1.0,57.0,113.0);
float3 b=float3(-1.,-1.,-1.);
float3 pb=p+b;
float3 pbm=pb-ncti*floor(pb/ncti);
float3 pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
float3 r=float3(b)-f+pbmh;
float d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(-1.,-1.,0.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(-1.,-1.,1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(-1.,0.,-1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(-1.,0.,0.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(-1.,0.,1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(-1.,1.,-1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(-1.,1.,0.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(-1.,1.,1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(0.,-1.,-1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(0.,-1.,0.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(0.,-1.,1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(0.,0.,-1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(0.,0.,0.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(0.,0.,1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(0.,1.,-1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(0.,1.,0.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(0.,1.,1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(1.,-1.,-1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(1.,-1.,0.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(1.,-1.,1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(1.,0.,-1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(1.,0.,0.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(1.,0.,1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(1.,1.,-1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(1.,1.,0.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
b=float3(1.,1.,1.);
pb=p+b;
pbm=pb-ncti*floor(pb/ncti);
pbmh=frac(sin(float3( dot(pbm,float3(127.1,311.7, \
74.7)),dot(pbm,float3(269.5,183.3,246.1)),dot(pbm,float3(113.5,271.9,\
124.6))))*43758.5453123);
r=float3(b)-f+pbmh;
d=dot(r,r);
id=lerp(id,dot(p+b,dd),float(d<res.x));
res=lerp(res,float2(d,res.x),float(d<res.x));
res=lerp(res,float2(res.x,d),float(d<res.y));
return float3( sqrt( res ), abs(id) );
As far as the optimization goes, I had some success raymarching to multiple render targets, rendering a full view sphere instead of just visible pixels and updating distant steps at lower resolution and less often. Still can’t seem to get rid of some tiling artifacts though.
https://www.youtube.com/watch?v=ZmSVTSqeYlI