I implemented the spherical Lissajous curve as a shader with Shadertoy.
Tuesday, September 2, 2025
Sunday, August 24, 2025
Procedural Texture Filter System Variables
Affinity Photo's Procedural Texture Filter System Variables
x, y, rx, ry, w, h, pi
x is the horizontal pixel coordinate position beginning with 0 at the left edge of the document and increasing toward the right by 1 for each pixel.
y is the vertical pixel coordinate position beginning with 0 at the top edge of the document and increasing downward by 1 for each pixel.
rx and ry are relative pixel coordinates. These coordinates allow repositioning of the coordinate system in two ways. Double-clicking the mouse on the document moves the origin (0,0) to the current position of the mouse. Click and dragging moves the coordinate system from the current position to the position you drag it to.
w is the width of the document in pixels, ie 1024
h is the height of the document in pixels, ie 768
pi is the geometric constant 3.14159265...
RGBA inputs
R contains the pixel information for the red channel in the document. It is not possible to access current image pixels individually from this variable. It is possible to modify the image using the channel outputs.
G contains the pixel information for the green channel.
B contains the pixel information for the blue channel.
A contains the pixel information for the alpha channel.
If the document is in CMYK mode, the letters C, M, Y, and K represent the color pixel information for the document. Note that you won't be able to access your RGB filters if the document is set to CMYK color mode.
p cannot be used as a custom input or as a variable name. p followed by a digit may not be used as a custom input but may be used to define a var variable. This includes p1, p2a, p304, etc.
Variable names must begin with a letter may only consist of numbers and letters, and _ (underscore) characters. Upper and lower case letters are allowed and a1 is not the same variable as A1. Space is not allowed nor are other special characters.
A 1024 x 768 landscape document would have an x value ranging from 0 to 1024, with 0 just to the left of the first pixel and 1024 just to the right of the last pixel. A value of x centered on the first pixel would be .5.
Friday, August 22, 2025
Affinity Photo Procedural Texture Filter: Seigaiha
Seigaiha Pattern
- var v=vec2(x,y)*a/w+vec2(of/2,of/4); // Coordinates with offset
- var v1=fraction(v)-.5; // Mask 1 Coordinates
- var m1=smoothstepn(.5-s1/10,.5+s1/10,length(v1))*osci(v.y); // Mask 1 Positive
- var v2=fraction(v+vec2(0,.5))-.5; // Mask 2 Coordinates
- var m2=1-smoothstepn(.5-s1/10,.5+s1/10,length(v2))*osci(v.y-.5); // Mask 2 Negative
- var v3=fraction(v+vec2(.5,.75))-.5; // Mask 3 Coordinates
- var m3=1-smoothstepn(.5-s1/10,.5+s1/10,length(v3))*osci(v.y-.25); // Mask 3 Negative
- m1*m2*m3*smoothosc(b*length(v1),s2) // Mask with lines
Sunday, June 29, 2025
Affinity Photo Procedural Texture Filter
Affinity Photo Procedural Texture Filter Examples
List of PTF Functions
Sign Related Functions
abs sign copysign
Rounding Related Functions
ceil floor fmod fraction irem idiv round roundup rounddown trunc truncate whole
Trig Functions
sin cos tan acos asin atan atan2 pi
Power Related Functions
pow powr sq sqrt
Statistical Functions
average max mid min
Specialized Math Functions
dim fma rgbtoi
Numeric Range Related Functions
tocui tohcui clamp clampmin clampmax saturate
Geometry and Vector Related Functions
cross dist dist_sq distance dot length length_squared norm normalise normalize
vec2 vec3 vec4 vec5 vec6 tovec3 tovec4 tovec5 tovec6
rev rotl rotr
swap 12 swap 13 swap23 swapxy swapxz swapyz swaprg swaprb swapgb
neg1 neg2 neg3 neg12 negx negy negz negxy negr negg negb negrg
debump
Interpolation Functions
lerp mix scurveinterp scerp sininterp serp cubicinterp cerp cubic scurveinterpolant
scint sininterpolant sint
Step Functions
mapcui step smoothstep smoothsteplin smoothstepsc smoothstepsin smoothstepcs smoothstepsq smoothstepsqi smoothstepcb smoothstepcbi smoothstepsin smoothstepsini smoothstepcr smoothstepcri smoothsteprt smoothsteprti
stepn smoothstepn smoothstepnlin smoothstepnsc smoothstepncs smoothstepnsq smoothstepsqi smoothstepncb smoothstepncbi smoothstepnsini smoothstepncr smoothstepncri smoothstepncrt smoothstepnrti
Quantization
quantize quantizelin quantizesc quantizesin quantizecs
Oscillators
osc osci oscsc oscsin osccs osccubic oscsq oscsqi osccb osccbi oscpsin oscpsini osccr osccri oscrt oscrti
smoothosc smoothosclin smoothoscsin smoothosccs
osch oschi oschsc oschsin oschcs oschcubic oschsq oschsqi oschcb oschcbi oschpsin oschpsini oschcr oschcri oschrt oschrti
smoothosch smoothoschlin smoothoschsin smoothoschcs
Noise
noise noisei noisesc noisesin noisecs noisecubic noisesq noisesqi noisecb noisecbi noisepsin noisepsini noisecr noisecri noisert noiserti
noiseh noisehi noisehsc noisehsin noisehcs noisehcubic noisehsq noisehsqi noisehcb noisehcbi noisehpsin noisehpsini noisehcr noisehcri noisehrt noisehrti
perlin perlinsc perlinsin perlincubic perlincs
perlinh perlinhsc perlinhsin perlinhcubic perlinhcs
cellnoise cellnoise2 cellnoisedist cellnoiseedge
dir diri dirsc dirsin dircs
udiri udir udirsc udirsin udircs
dir3 dir3i dir3sc dir3sin dir3cs
udir3 udir3i udirsc udir3sin udir3cs
Other functions
var
Reserved/Internal Variable Names
w h x y rx ry R G B pi
Unknown: pc p pt px
Cannot be used as custom inputs: p p0 p1 p2 p3 p4 p5 (p followed by any number) however, these can be used as variable names.
Operators
+ - * / ^ ( ) . = ; ,
Exponentiation has the same priority as multiplication and division: a*b^c =(a*b)^c not a*(b^c).
I am making a series of video tutorials for Affinity Photo's procedural texture filter. This page provides an index for the functions used in each video.
var vec2 clampmin dot smoothstepn abs oschsin
var vec2 length
var vec2 perlincubic udirsc smoothstep norm debump dot pow
var vec2 clampmin clampmax osc smoothstep
var vec2 atan2 floor smoothstep length cos
var vec2 floor diri step length fraction
var fraction vec2 atan2 osci pow cos floor length
var fraction vec2 atan2 floor osc length pow cos
var vec2 atan2 floor osc length cos
var vec2 noiseh perlincubic
var vec2 vec3 sqrt fraction step max min smoothstep
var vec2 step perlincubic cellnoisedist
var vec2 fraction smoothstepcs length length max
var vec2 atan length sin smoothstep
var vec2 atan2 length cellnoise abs dirsc smoothstep
var vec2 cos sin vec3 oscsc osccri oschsc osci dirsc
rev rotl rotr swap12 swap13 swap23 swapxy swapxz swapyz swaprg swaprb swapgb neg1 neg2 neg3 neg12 negx negy negz negxy negr negg negb negrg
var norm vec2 sqrt swapxy fraction length step atan2 quantize
var vec2 pow noisei smoothstep osccr osci
var vec2 noisei cos sin smoothstep osc quantize perlinhcubic osc average
var normalize vec2 sqrt fraction step length smoothstep cos sin
var vec2 cos sin step osc smoothstep
var vec2 cellnoise cellnoise2 perlincubic perlinhcubic norm cos sin noisehcubic
var norm vec2 vec3 max oscsqi perlincubic noisehsc noiseh
var vec2 fraction length atan2 oscsc step
var norm vec2 cos sin perlincubic perlinhcubic noisehcubic
var vec2 cos sin normalize perlincubic noisehi
var vec2 cos sin oscsc
osc oscsc
var norm vec2 cellnoisedist dir noisehcubic perlinhcubic debump dot pow
var vec2 vec3 normalize floor fraction smoothstep noisei lerp cellnoise2 oscsc perlin perlincubic
var vec2 length
var vec2 noisei diri length atan udiri dir3i udir3i dirsc
var vec3 vec2 smoothstep perlincubic
var normalize vec2 fraction floor step
var normalize vec2 sqrt fraction step length smoothsteplin max abs dot swap12
var vec2oscsc osci max
var vec2 fraction oscrt osc fraction osch noisehsc max norm debump dot pow
var vec2 abs cellnoisedist perlinhcubic serp norm debump dot pow
var vec2 cellnoisedist quantize
var vec2 pow noisei smoothsteplin average cos sin osccr dirsc osc perlinhcubic
var vec2 vec3 perlinhcubic mapcui osccr step osc
var vec2 cellnoise saturate average
var vec2 perlinhcubic osch clamp
var vec2 mapcui max osccr perlinhcubic