Показать сообщение отдельно
Старый 25.09.2008, 09:44   #22
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: МоКиньшЪ в Отпуск!

Туман аналогичен как и свету. Только источник - это камера. Узнаёшь в пиксельном шейдере растояние distance(a,b), затем отнимаешь параметр Near, потом применяешь min(a,0), затем делишь на параметр длины тумана, можно добыть из 2 параметров: (Far-Near), и применяешь max(a,0), в итоге получаешь после этого число, от нуля до 1, это и будет параметр тумана, затем ещё с помощью pow(a,0.8-1.2), можешь менять степень перехода тумана. Туман - заменяет процентно, итоговый цвет на цвет тумана.

Что-бы узнать позицию пикселя в мировых координатах, нада в ввершинном применить мировую матрицу к позиции вершины:
OUT.pWorld = mul(IN.Position,MatWorld);
В пиксельном, IN.pWorld будет позицией пикселя в мировых координатах.
float Fog=pow((distance(CamPos,IN.pWorld)-FogNear)/FogFar,FogSmoth);
float3 CamPos; - координаты камеры.
float3 IN.pWorld; - передавай в структуре из вершинного в пиксельный.
float FogNear; - Расстояние с которого начнётся туман.
float FogFar; - Расстояние на котором туман уже всё затуманит.
float FogSmoth; - Смягчение тумана, число лучше держать в рамках 1.0. но поиграйся увеличивая/уменьшая немного.
float3 FogColor; - Цвет тумана.

И в итоге примерно что-то такое:
Color=Color*(1.0f-Fog)+FogColor*Fog

Ещё можно поизвращаться и заместо цвета тумана, юзать цвет размытой кубмапы неба, получится много красивее.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
HolyDel (25.09.2008), tormoz (25.09.2008)