ask:
option 1: Build a shader effect that uses custom vertex attributes.
Use three.js and WebGL. You can either use a BufferGeometry and populate all the attribute data for it, or you can use a built-in geometry type, and add an additional BufferAttribute to it. Use whatever makes the most sense for your effect.
option 2: Build a post-processing effect that uses a custom shader pass.
Use three.js and WebGL. You can stack many effects in your EffectComposer but at least one of them has to use a custom shader! Use a GUI to control parameters and toggle render passes.
You can combine both options if you’d like!