fuckingtech/public/assets/glsl/lygia/sample/untile.hlsl
Elias Rhouzlane bf76c6b086 fix: code
2025-04-06 17:23:52 +02:00

65 lines
No EOL
1.9 KiB
HLSL

#include "../math/const.hlsl"
#include "../generative/random.hlsl"
#include "../sampler.hlsl"
/*
contributors: Inigo Quiles
description: |
Avoiding texture repetition by using Voronoise: a small texture can be used to generate infinite variety instead of tiled repetition. More info: https://iquilezles.org/articles/texturerepetition/
use: sampleUNTILE(<SAMPLER_TYPE> texture, <float2> st, <float> noTiling)
options:
- SAMPLER_FNC(TEX, UV)
- SAMPLEUNTILE_TYPE
- SAMPLEUNTILE_SAMPLER_FNC(UV)
*/
#ifndef SAMPLEUNTILE_TYPE
#define SAMPLEUNTILE_TYPE float4
#endif
#ifndef SAMPLEUNTILE_SAMPLER_FNC
#define SAMPLEUNTILE_SAMPLER_FNC(TEX, UV) SAMPLER_FNC(TEX, UV)
#endif
#ifndef SAMPLEUNTILE_RANDOM_FNC
#define SAMPLEUNTILE_RANDOM_FNC(XYZ) random4(XYZ)
#endif
#ifndef FNC_SAMPLEUNTILE
#define FNC_SAMPLEUNTILE
SAMPLEUNTILE_TYPE sampleUntile(SAMPLER_TYPE tex, in float2 st, float v) {
float2 p = floor( st );
float2 f = frac( st );
// derivatives (for correct mipmapping)
// float2 ddx = dFdx( st );
// float2 ddy = dFdy( st );
SAMPLEUNTILE_TYPE va = float4(0.0, 0.0, 0.0, 0.0);
float w1 = 0.0;
float w2 = 0.0;
float2 g = float2(-1.0, -1.0);
for( g.y = -1.0; g.y <= 1.0; g.y++ )
for( g.x = -1.0; g.x <= 1.0; g.x++ ) {
float4 o = SAMPLEUNTILE_RANDOM_FNC( p + g );
float2 r = g - f + o.xy;
float d = dot(r,r);
float w = exp(-5.0*d );
// SAMPLEUNTILE_TYPE c = textureGrad(tex, st + v*o.zw, ddx, ddy );
SAMPLEUNTILE_TYPE c = SAMPLEUNTILE_SAMPLER_FNC(tex, st + v*o.zw);
va += w*c;
w1 += w;
w2 += w*w;
}
// normal averaging --> lowers contrasts
// return va/w1;
// contrast preserving average
float mean = 0.3;// textureGrad( samp, uv, ddx*16.0, ddy*16.0 ).x;
SAMPLEUNTILE_TYPE res = mean + (va-w1*mean)/sqrt(w2);
return lerp( va/w1, res, v );
}
#endif