Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma kernel SDF2D
- Texture2D<float> _sdfTexIn;
- SamplerState sampler_sdfTexIn;
- RWTexture2D<float> _sdfTexOut;
- uint _sdfTexSizeX;
- uint _sdfTexSizeY;
- float _sdfDistMod;
- uint _frame;
- float2 _mousePos;
- bool _leftClick;
- bool _rightClick;
- bool _midClickPress;
- bool _midClickDown;
- bool _rPressed;
- static const float MAXDIST = 1024.0;
- float pack(float dist)
- {
- dist = min(dist, MAXDIST) / MAXDIST;
- dist /= _sdfDistMod;
- dist = dist * 0.5 + 0.5;
- return clamp(dist, 0.0, 1.0);
- }
- float unpack(float dist)
- {
- dist = dist * 2.0 - 1.0;
- dist *= _sdfDistMod;
- dist *= MAXDIST;
- return dist;
- }
- float2 toUV(float2 pos)
- {
- return float2(pos.x / _sdfTexSizeX, pos.y / _sdfTexSizeY);
- }
- float sdSphere(float2 uv, float2 pos, float radius)
- {
- uv -= pos;
- return length(uv) - radius;
- }
- float sdBox(float2 uv, float2 pos, float2 b)
- {
- uv -= pos;
- float2 d = abs(uv) - b;
- return length(max(d, 0.0)) + min(max(d.x, d.y), 0.0);
- }
- float opSub(float d1, float d2)
- {
- return max(d1, -d2);
- }
- float opAdd(float d1, float d2)
- {
- return min(d1, d2);
- }
- float sdf(float2 pos)
- {
- return _sdfTexIn.SampleLevel(sampler_sdfTexIn, toUV(pos), 0);
- }
- float neighborMin(float2 uv, float2 delta)
- {
- float a = unpack(sdf(uv + delta));
- float b = unpack(sdf(uv - delta));
- return min(abs(a), abs(b));
- }
- float eikonal1d(float h, float v, float g)
- {
- return min(h, v) + g;
- }
- float eikonal2d(float h, float v, float g)
- {
- float hv = h + v;
- float d = hv * hv - 2.0 * (h * h + v * v - g * g);
- return 0.5 * (hv + sqrt(d));
- }
- [numthreads(8, 8, 1)]
- void SDF2D(uint2 id : SV_DispatchThreadID)
- {
- float2 uv = float2(float(id.x), float(id.y)) + float2(0.5, 0.5);
- float current = unpack(sdf(uv));
- if (_frame == 0 || _rPressed)
- {
- current = sdBox(uv, float2(-10.0, 128.0), float2(10.0, 256.0));
- current = opAdd(current, sdBox(uv, float2(266.0, 128.0), float2(10.0, 256.0)));
- current = opAdd(current, sdBox(uv, float2(128.0, -10.0), float2(256.0, 10.0)));
- current = opAdd(current, sdBox(uv, float2(128.0, 266.0), float2(256.0, 10.0)));
- }
- if (_leftClick)
- {
- float s = sdSphere(uv, float2(_mousePos.x, _mousePos.y), 25.0);
- current = opAdd(current, s);
- }
- if (_rightClick)
- {
- float s = sdSphere(uv, float2(_mousePos.x, _mousePos.y), 15.0);
- current = opSub(current, s);
- }
- //if (_midClickPress)
- //{
- // if (current > 1.0)
- // {
- // current = MAXDIST;
- // }
- // if (current < -1.0)
- // {
- // current = -MAXDIST;
- // }
- //}
- if (_midClickDown)
- {
- float c = abs(current);
- float h = neighborMin(uv, float2(1.0, 0.0));
- float v = neighborMin(uv, float2(0.0, 1.0));
- float e = (abs(h - v) >= 1.0) ?
- eikonal1d(h, v, 1.0) :
- eikonal2d(h, v, 1.0);
- if (c > 1.0) c = e;
- current = sign(current) * c;
- }
- _sdfTexOut[id.xy] = pack(current);
- }
Add Comment
Please, Sign In to add comment