Oddly, it turns out that my very simple method for bump-mapping shouldn’t have worked at all, as the normals stored in the normal-map are in a completely different coordinate-space (tangent space) to the rest of the scene. This explains why the bump map isn’t very convincing.
I may be wrong on this (as I frequently am), but it looks as if it may not be possible to do bump-mapping ‘the proper way’ in QC, as all the methods I’ve seen seem to require values to be calculated outside the shader, then passed in per-vertex. This isn’t something you can do in QC, unfortunately.
On a more positive note, it may be possible to use my very simple (and wrong) approach to approximate lighting on vertex-displaced meshes. I’ll have to do some more research on this one.