
Absolute Value
I’m often trying to find the magnitude of something, regardless of sign. Commonly done for things like normals or velocity or distance. You would expect there to be a built in tool for that sort of thing, but there isn’t.
Previously, I did it with a CT or a Fuse operating on a per-pixel basis. An f.Color.rgb = abs(f.Color.rgb) sort of thing, which is pretty slow in Fusion as a CT or Fuse, but is plenty fast in Cg. More on that later.
Today I had an idea on how to do it with a matrix. The basic idea is to scale the the image by .5, and by -.5 and find the difference of the two. So |x| = (.5*x)-(-.5*x)
This method is much faster. The resulting Fuse runs about 40% faster than a CT, and several times faster than the old Fuse I had made which operated pixel by pixel. Unfortunately, ROI isn’t supported yet for Fuses, so if you have a tiny ROI, the CT or the CMx’s will both run faster. EDIT: ROIDS can be supported in Fuses… I’ll need to add it to the Fuses I’ve posted so far. Stay tuned…
So here’s the Fuse, a Cg ViewShader that lets you view the absolute value in a Viewer, and an example comp showing the CT, Fuse, and CMx methods, as well as the ViewShader.
Download FAbsolute Fuse 1.05
Download Absolute Value Viewshader 1.01
Download Example Comp (Absolute Fuse) A01
It would be interesting to see if the disparity between the speeds of processing the matrix vs per-pixel goes away when you compile a c++ plugin…
2 Comments »