Fog (Туман)
Окружающий туман - эффект, который используется во всех играх, поскольку позволяет придать объектам или сцене реалистичность, а также "почувствовать" глубину сцены. Кроме того, он позволяет скрыть ненужную геометрию.
Описание
Линейный туман
Экспоненциальный (квадратичный) туман
Ссылки
Описание
Эффект тумана зависит от трех основных компонент:
1. Цвет тумана (C).
2. Плотность (g).
3. Расстояние (d).
В сцене с туманом, интенсивность света, которая достигает камеры пользователя, зависит от трех компонент:
1. Поглощение - величина, которая регулирует перекрытие световой интенсивности частиц вдоль трассируемого луча.
2. Рассеивание - это выбивание лучей из луча, который идет к глазу.
3. Рассеивание внутрь - это попадание (из-за рассеивания) других лучей в луч, который идет к глазу.
Эти три компоненты обобщают и характеризуют одним коэффициентом g, т.е. плотностью.
Поскольку объекты находящиеся в дали должны больше поддаваться эффекту тумана, ввели коэффициент d, т.е. расстояние. Окончательный цвет вершины получают интерполированием цвета тумана и текущем цветом: Lerp(Cfog, Ccurrent, f)
Где f - влияние тумана на цвет вершины, т.е. при 0 - цвет вершины будет цветом тумана (это случай когда геометрия находится вдали от зрителя), а при 1 - наоборот соответственно.
Вычислять Cfinal надо только в том случае, если вы используете пиксельный шейдер:
float4 Cf;
sampler BaseTexture;
struct PS_INPUT
{
float2 texcoord : TEXCOORD0;
float f: TEXCOORD1;
};
float4 main(PS_INPUT Input): COLOR
{
float4 Ccur = tex2D(BaseTexture, Input.texcoord);
return lerp(Cf, Ccur * Input.Diffuse, Input.f);
}Иначе это сделает за нас direct3d9 установкой следующих стейтов:
mRenderDevice->SetRenderState(D3DRS_FOGCOLOR, color); mRenderDevice->SetRenderState(D3DRS_FOGENABLE, TRUE); Draw(); mRenderDevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
или с помощью OpenGL:
glEnable( GL_FOG ); glFogi( GL_FOG_COLOR, color); Draw(); glDisable( GL_FOG );
Линейный туман
Самый простой из всех видов.
Основное уравнение:
f = (Zfogend – d)/(Zfogend – Zfogstart)
В таком случае частицы тумана распределяются равномерно от точки Zfogstart и до точки Zfogend. d – представляет глубину, или расстояние от видового вектора до начала появления тумана. Вот простенький шейдер для линейного тумана: