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

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

Bump-mapping

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


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

Последние снимки:
Последние снимки
Последние снимки
Счетчики:
 
    Я сам лично довольно долго мучился с bump-mapping`ом подгоняя его под игру так, чтобы было красиво. Далее будут представлены части программы отвечающей за bump-mapping.
    Для начала, чтобы программа корректно работала необходимо написать

inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }

в начале программы (я это делаю в начале странице), эта строчка нужна для перевода FLOAT в DWORD, конечно есть и другие способы, но этот наиболее правильный.
И так, до моих опытов, т.е. без использования bump-mapping`a жук выглядел так (рис.1).
 bump-mapping = OFF

    Для начала покажу довольно красивый эффект, он довольно хорошо подходит для влажных поверхностей и морской волны.(рис.2)
//BumpMaping для воды
d3d_Device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
d3d_Device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3d_Device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
d3d_Device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
d3d_Device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
d3d_Device->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );

d3d_Device->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
d3d_Device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_BUMPENVMAPLUMINANCE);
d3d_Device->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3d_Device->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );

d3d_Device->SetTextureStageState( 1, D3DTSS_BUMPENVMAT00, F2DW(1.0f) );
d3d_Device->SetTextureStageState( 1, D3DTSS_BUMPENVMAT01, F2DW(0.0f) );
d3d_Device->SetTextureStageState( 1, D3DTSS_BUMPENVMAT10, F2DW(0.0f) );
d3d_Device->SetTextureStageState( 1, D3DTSS_BUMPENVMAT11, F2DW(1.0f) );

d3d_Device->SetTextureStageState( 1, D3DTSS_BUMPENVLSCALE, F2DW(0.5f) );
d3d_Device->SetTextureStageState( 1, D3DTSS_BUMPENVLOFFSET, F2DW(0.0f) );

d3d_Device->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 0 );
d3d_Device->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_ADD );
d3d_Device->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3d_Device->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );

А так же можете по экспериментировать, вот еще один пример реализации воды.

d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVMAT00, F2DW(0.5f));
d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVMAT01, F2DW(0.0f));
d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVMAT10, F2DW(0.0f));
d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVMAT11, F2DW(0.5f));
d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVLSCALE, F2DW(1.0f));
d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVLOFFSET, F2DW(0.0f));
Cink bump-mapping


    Еще один пример можно применить в качестве металла, на пример для грубо хромированной или оцинкованной детали (рис.3).

//что-то типа хрома
d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVMAT00, F2DW(0.0f));
d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVMAT01, F2DW(0.1f));

Water bump-mapping


    Ну и на последок то что я применяю для рельефного панциря у жуков(рис.4).

//Нормально, только небольшие возвышения
d3d_Device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
d3d_Device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3d_Device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
d3d_Device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
d3d_Device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
d3d_Device->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 );

d3d_Device->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 );
d3d_Device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_BUMPENVMAP);
d3d_Device->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3d_Device->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_CURRENT );
d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVMAT00, F2DW(0.01f));
d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVLSCALE, F2DW(0.0f));
d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVLOFFSET, F2DW(0.0f));

d3d_Device->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX, 0 );
d3d_Device->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_ADDSMOOTH );
d3d_Device->SetTextureStageState( 2, D3DTSS_COLORARG1, D3DTA_TEXTURE );
d3d_Device->SetTextureStageState( 2, D3DTSS_COLORARG2, D3DTA_CURRENT );


Normal bump-mapping


    Только не забудьте поставить перед просчетом объекта все его текстуры.

d3d_Device->SetTexture (0, TEX_object);
d3d_Device->SetTexture (1, TEX_BUMP_MAPPING );
d3d_Device->SetTexture (2, TEX_LIGHT_MAPPING);





Hosted by uCoz