You'd have to do that via code (for example ent_buffers, see previous post), yes.
That's true, the available data is very limited (for my cases it's enough most of the time).
To help with your original question: Just use 128 as your "0" in your texture channels, then everything below 128 is negative, above is positive. In the vertex shader:
float4 texData = tex2Dlod(...);
float3 displacement = (texData-0.5)*someScalingFactor;