|
Если вы хотите забацать в своей игрухе туман - то этотк урок именно для вас. Сегодня я расскажу как в своих 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( 0L, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, FogColor, 1.0f, 0L); |
Теперь перед отрисовкой кубика просто устанавливаем туманчик: |
SetupPixelFog(FogColor, FogMode); |
И наслаждаемся настоящим пиксельным туманом! Исходник качаем !!!здесь!!! (~171Kb) Управление: 1 - Врубаем D3DFOG_EXP туман. 2 - Врубаем D3DFOG_EXP2 туман. 3 - Врубаем D3DFOG_LINEAR туман. До скорых встреч... Автор: L1f 
|
|