Оптимизировано для Internet Explorer 6 и выше.
Последние снимки:
Счетчики:
Я сам лично довольно долго мучился с bump-mapping`ом подгоняя его под игру так, чтобы было красиво. Далее будут представлены части программы отвечающей за bump-mapping. Для начала, чтобы программа корректно работала необходимо написать inline DWORD F2DW( FLOAT f ) { return *((DWORD*)&f); }
в начале программы (я это делаю в начале странице), эта строчка нужна для перевода FLOAT в DWORD, конечно есть и другие способы, но этот наиболее правильный. И так, до моих опытов, т.е. без использования bump-mapping`a жук выглядел так (рис.1). Для начала покажу довольно красивый эффект, он довольно хорошо подходит для влажных поверхностей и морской волны.(рис.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));
Еще один пример можно применить в качестве металла, на пример для грубо хромированной или оцинкованной детали (рис.3).
//что-то типа хрома
d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVMAT00, F2DW(0.0f));
d3d_Device->SetTextureStageState(1, D3DTSS_BUMPENVMAT01, F2DW(0.1f));
Ну и на последок то что я применяю для рельефного панциря у жуков(рис.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 );
Только не забудьте поставить перед просчетом объекта все его текстуры.
d3d_Device->SetTexture (0, TEX_object);
d3d_Device->SetTexture (1, TEX_BUMP_MAPPING );
d3d_Device->SetTexture (2, TEX_LIGHT_MAPPING);