Решил я понемногу начать 3D в своей fits-смотрелке реализовывать. Для начала - без выпендрежа, тупыми страшными треугольниками. Посмотрел примеры (terrain, например), крутить 3D получается довольно быстро (60fps для изображения 3000x3000, 1500fps для 500x500), а вот нормали вычисляются медленно (~5с для 3000x3000).
Пока придумал следующее: треугольники отображать полосами, а нормали вычислять в два захода, сначала все нормали для верхнего левого и правого нижнего треугольника с вершиной в i-й точке, а затем, суммируя нормали шести треугольников с вершинами в данной точке и нормализуя их, получать окончательную нормаль:
/* вычисление нормалей для точки (x,y) изображения
* сначала заполняются массивы нормалей для правого нижнего и левого верхнего
* треугольников, с одной из вершин в данной точке,
* затем для каждой точки вычисляется общая нормаль
*
* ПРИНЦИП
* *---B---*---* (rd - прав.ниж. треугольник, ul - лев. верхний)
* | / | / | / | Нормаль в точке А при отображении треугольников, как на рис.,
* E---A---C---* складывается из нормалей Aul+Bdr+Cul+Adr+Dul+Edr
* | / | / | / | Нормали для отдельных треугольников: (X - интенсивность в точке)
* *---D---*---* (нормаль = верт. вектор x гор. вектор)
* не нормализованная Aul = (E-A, A-B, 1)
* Adr = (A-C, D-A, 1)
*/
Но вот с распараллеливанием (для CUDA'ы) пока не могу придумать, что делать (т.к. на границах областей придется влезать в соседние области => использовать разделяемую память для ускорения вычислений вряд ли получится).