Оригинально. Правда, очень медленно - несколько секунд (в DirectX за секунду можно перерисовать буфер и несколько тысяч раз).
Я тоже думал над формулами. Я бы сделал несколько этапов.
1. (как у вас). Берётся убывающая ф-ия. Это яркость для R, G, B. Причём, если мы хотим в центре светлое пятно, то внутри пятна R=G=B. А за границами пятна G и B становятся 0, а R плавно убывает до некой константы.
2. Параметр убывающей ф-ции это сферические координаты широта и долгота. У широты диапазон -pi/2 .. pi/2 (северное и южное полушарие), а у долготы 0..pi (так любят математики) или -pi/2 .. pi/2 (так люди обозначают западное и восточное полушария). Сразу надо сделать поправку в функцию: половина полушария не освещена (или, как часто делают в DirectX, добавить небольшую константу).
3. Написать функцию поворота шара. Для сферических координат это просто смещение.
4. Наконец сделать проекцию. Это синусы и косинусы.
|