Clipping solved! Turns out that, in the shader, if I subtract the steps from the pixel's world position (instead of adding it), everything works fine. Next step: transfer functions.