How to render a volume by vector?

If k1 and k2 are intensity and gradient then you can use VTK’s 2D transfer function (an image that assigns RGBA value for coordinate pairs). See description of the transfer function here. You can set the 2D transfer function by typing this into the Python console:

slicer.mrmlScene.GetFirstNodeByClass("vtkMRMLVolumePropertyNode").GetVolumeProperty().SetTransferFunction2D(image)

If k1 and k2 are arbitrary scalar components then you can apply your 2D transfer function to the volume to get an RGBA volume (e.g., using numpy) and use that as input for volume rendering.
To render an RGBA volume, you need to turn off independent component volume property option).