Проект 'Жуки' (рабочее название)
Copyright(C) 2004
{ Главная } { Новости } { Статьи } { Сценарий } { Форум }

{ Объекты } { Screen shots } { Программы } { Об авторе }

Реализация тумана

Проект 'Жуки' (рабочее название)


Оптимизировано для Internet Explorer 6 и выше.

Последние снимки:
Последние снимки
Последние снимки
Счетчики:
 

    Туман

Вот вышла вторая статья по теории трехмерной графики.
Сегодня мы научимся делать туман и разберемся, как там все происходит.
Для начала надо сказать что туман бывает трех видов: пиксельный, вершинный и объемный, но о нем в других уроках т.к этот туман– дело избранных видеокарт. Ниже следуют два исходных кода для разных видов тумана.

Пиксельный туман

void PixelFog(void)
{
float Start = 10.0f; // начало тумана(для linear)
float End = 20.0f; // конец тумана(для linear)
float Density = 0.33f; // густота - для exponential
DWORD Color = 0xFFFFFF; // Цвет - белый
DWORD Mode = D3DFOG_LINEAR; // Вид

g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE); // использовать туман
g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color); // Цвет тумана

if( Mode == D3DFOG_LINEAR )
{
g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
g_pDevice->SetRenderState(D3DRS_FOGEND, *(DWORD *)(&End));
}
else
{
g_pDevice->SetRenderState(D3DRS_FOGTABLEMODE, Mode);
g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
}
}


Вершинный туман

void SetupVertexFog(BOOL UseRange)
{
float Start = 10.0f; // начало тумана(для linear)
float End = 10.0f; // конец тумана(для linear)
float Density = 0.33f; // густота - для exponential
DWORD Color = 0xFFFFFF; // Цвет - белый
DWORD Mode = D3DFOG_LINEAR; // Вид

g_pDevice->SetRenderState(D3DRS_FOGENABLE, TRUE); // Использовать туман
g_pDevice->SetRenderState(D3DRS_FOGCOLOR, Color); // Цвет тумана

if(Mode == D3DFOG_LINEAR)
{
g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode);
g_pDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD *)(&Start));
g_pDevice->SetRenderState(D3DRS_FOGEND, *(DWORD *)(&End));
}
else
{
g_pDevice->SetRenderState(D3DRS_FOGVERTEXMODE, Mode);
g_pDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD *)(&Density));
}

if(UseRange) //использовать туман по расстоянию
g_pDevice->SetRenderState(D3DRS_RANGEFOGENABLE, TRUE);
}


Формулы тумана

Линейный туман ( D3DFOG_LINEAR )
Для этого вида нужно задать начало и конец. При чем на конечном расстоянии будет расположена плоскость, за которой ни чего не будет видно(используется как правило в старых играх).

Экспоненциальный туман ( D3DFOG_EXP, D3DFOG_EXP2 )
Для этого тумана важна не дистанция, а плотность, которая колеблется от 0.0 до 1.0. Да и кстати надо сказать, что этот туман более красив пример его можете наблюдать в игре ниже приведен скриншот.

24_11_03


Всем спасибо, надеюсь всем понятно, если есть проблемы пишите на aivle1@yandex.ru



Hosted by uCoz