We can view the IFS-to-image process as a composition of two affine transforms:
- One for the in-IFS functions (zoom, rotate, offset)
- One for the IFS-to-image functions (scale)
And because a composition of affine transforms is itself an affine transform, we can do everything at once.
Eventually, the final affine matrix should be provided to the GPU directly, I just wanted to prove this works for now.
Can't put GPU tests in the `-shader` crate because `spirv-builder` doesn't handle recursive invocation, but should migrate the CPU tests there eventually.