|
|
|
Если вы хотите забацать в своей игрухе туман - то этотк урок именно для вас. Сегодня я расскажу как в своих 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 
|
|
|