Если вы хотите забацать в своей игрухе туман - то этотк урок именно для вас. Сегодня я расскажу как в своих Direct3D приложениях использовать возможности пиксельного тумана. Он неплохо выглядит, а главное создается буквально за пару секунд. Эта статья будет короткой, так что никуда не уходите

Пиксельный туман реализуется на основе z-буфера, т.е. из буфера берется глубина пикселя (расстояние его до камеры) и в зависимости от нее, он окрашивается в цвет тумана больше или меньше. Короче говоря все очень просто...

В Direct3D есть три типа тумана:
1. D3DFOG_EXP - Цвет пикселя высчитывается по экспоненте.
2. D3DFOG_EXP2 - Улучшенный первый вариант (Выглядит немного лучше).
3. D3DFOG_LINEAR - Цвет пикселя по линейному закону.

Так как вычислительные способности сегодняшей апаратуры с лихвой покрывают все требования тумана, я рекомендую использовать третий его тип - для нас самое главное качество картинки! Но в данном уроке я расскажу о использовании их всех.

Этот урок основывается на уроке номер 3 из цикла. Открываем его и добавим в него две новых переменных: тип и цвет тумана.

DWORD FogMode	= D3DFOG_LINEAR;			// Тип тумана  (По умолчанию LINEAR)
DWORD FogColor	= D3DCOLOR_ARGB(0, 100, 100, 100);	// Серенький цвет тумана

А теперь мы создадаим функцию для удобного включения нашего туманчика. Следующий код добавляем после всех определений:

//-----------------------------------------------------------------------------
// Name: SetupPixelFog(DWORD Color, DWORD Mode)
// Desc: Устанавливаем пиксельный туман
//-----------------------------------------------------------------------------
void SetupPixelFog(DWORD Color, DWORD Mode)
{
				//  Для линейного тумана
	float Start   = 3.0f;	// Расстояние до камеры  на котором 
				// начнет появлятся туман
	float End     = 7.0f;	// Расстояние до камеры  на котором 
				// туман будет полностью скрывать объекты

	float Density = 0.26f;	// Плотность (только  для exp'ального) тумана

	// Включаем использование тумана
	g_pd3dDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);

	// Устанавливаем цвет тумана
	g_pd3dDevice->SetRenderState(D3DRS_FOGCOLOR, Color);

	// Set fog parameters.
	if( Mode == D3DFOG_LINEAR )
	{
		// Устанавливаем желаемый тип тумана (D3DFOG_LINEAR)
		g_pd3dDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
		// Ставим началное  и конечное расстояние  для тумана
		g_pd3dDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
		g_pd3dDevice->SetRenderState(D3DRS_FOGEND,   *(DWORD *)(&End));
	}
	else
	{
		// Устанавливаем желаемый тип тумана (D3DFOG_EXP или D3DFOG_EXP2)
		g_pd3dDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
		// Устанавливаем плотность тумана
		g_pd3dDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
	}
}

Немного изменим код отрисовки (Render): Чтобы туман смотрелся лучше, очищаем задний буфер в цвет тумана. Заменяем g_pd3dDevice->Clear(...BlaBlaBla...); на:

g_pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, FogColor, 1.0f, 0L);

Теперь перед отрисовкой кубика просто устанавливаем туманчик:

SetupPixelFog(FogColor, FogMode);

И наслаждаемся настоящим пиксельным туманом!
Исходник качаем !!!здесь!!! (~171Kb)
Управление:
1 - Врубаем D3DFOG_EXP туман.
2 - Врубаем D3DFOG_EXP2 туман.
3 - Врубаем D3DFOG_LINEAR туман.