You are correct, that is how you set the brightness.
As for a perceptually linear approximation, it's not exactly simple. First off, we perceive a linear increase in lumens as being less bright. The relationship is approximately exponential (or square/cube power), but it's not known. Second off, we're basically setting the cree led's power consumption, not its output in lumens - and it's more efficient at different power levels. So, that's not linear, either.
Because of the way we perceive light, adjacent power values quite low are very easily perceived. So, in doing a linear mapping, small changes at a low brightnesses are perceived as being large. In order to make this linear, we get an area where we increase the perceived value, but nothing actually changes, or we suddenly get a large step.
I think I've done a pretty good job in this library.
libraries/hexbright/hexbright.cpp has an approximation algorithm, search for set_light_level
programs/linearity_test has the code I used to find that particular algorithm.
I welcome any input you may have!