Ответ: МоКиньшЪ в Отпуск!
Туман аналогичен как и свету. Только источник - это камера. Узнаёшь в пиксельном шейдере растояние 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
Ещё можно поизвращаться и заместо цвета тумана, юзать цвет размытой кубмапы неба, получится много красивее.
|