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]();
авторизуйтесь
или войдите через