64 lines
1.4 KiB
Plaintext
64 lines
1.4 KiB
Plaintext
declare_inputs("denoise")
|
|
|
|
INV_SQRT_OF_2PI = 0.39894228040143267793994605993439
|
|
INV_PI = 0.31830988618379067153776752674503
|
|
|
|
:: set MRAD = 8
|
|
:: set MRADQ = MRAD * MRAD
|
|
|
|
tolerance = 0.01
|
|
|
|
radius = floor(sigma * kSigma + 0.5)
|
|
radQ = radius * radius
|
|
|
|
invSigmaQx2 = 0.5 / (sigma * sigma)
|
|
invSigmaQx2PI = INV_PI * invSigmaQx2
|
|
|
|
invThresholdSqx2 = 0.5 / (threshold * threshold)
|
|
invThresholdSqrt2PI = INV_SQRT_OF_2PI / threshold
|
|
|
|
uv = get_float2("$pos")
|
|
size = get_float2("$size")
|
|
|
|
centrPx = samplelum(uv, 0, 0)
|
|
|
|
zBuff = 0.0
|
|
aBuff = 0.0
|
|
|
|
radius_ceil = -radius - tolerance
|
|
radius_floor = radius + tolerance
|
|
|
|
:: for dx in range(-MRAD, MRAD + 1)
|
|
|
|
pt = sqrt(radQ - {{ dx * dx | float }})
|
|
pt = ceil(pt)
|
|
|
|
use_iteration_dx = {{ dx | float }} > radius_ceil and {{ dx | float }} < radius_floor
|
|
|
|
pt_ceil = -pt - tolerance
|
|
pt_floor = pt + tolerance
|
|
|
|
:: for dy in range(-MRAD, MRAD + 1)
|
|
|
|
use_iteration_dy = {{ dy | float }} > pt_ceil and {{ dy | float }} < pt_floor
|
|
use_iteration = use_iteration_dx and use_iteration_dy
|
|
|
|
|
|
d = vector2({{ dx | float }}, {{ dy | float}})
|
|
blurFactor = exp( -(d ^ d) * invSigmaQx2 ) * invSigmaQx2PI
|
|
|
|
walkPx = samplelum(uv + d / size, 0, 0)
|
|
|
|
dc = walkPx - centrPx
|
|
deltaFactor = exp( - dc * dc * invThresholdSqx2) * invThresholdSqrt2PI * blurFactor
|
|
|
|
zBuff = zBuff + deltaFactor if use_iteration else zBuff
|
|
aBuff = aBuff + deltaFactor * walkPx if use_iteration else aBuff
|
|
|
|
:: endfor
|
|
|
|
:: endfor
|
|
|
|
res = aBuff / zBuff
|
|
|
|
_OUT_ = merge_float4(res, res, res, res) |