10 апреля 2010 в 16:43
Direct3D Урок 05: Туман
Если вы хотите забацать в своей игрухе туман - то этотк урок именно для вас. Сегодня я расскажу как в своих 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 туман.
3 декабря 2012 в 21:41
А на OpenGL туман создаётся проще:glFog [i/f]();
авторизуйтесь
или войдите через