|
Растровый Эффект Blur.
Blur - самый простой растровый эффект, но вместе стем он очень важен для современной компьютерной графики. Так с его помощью можно заставить полигоны светиться, можно сделать аурц вокруг объекта, при должной сноровке можно даже сделать джедайский меч (который будет выглядеть не как светящаяся палка, а как язык текучего пламени). Собственно сам алгоритм заключается в том чтобы взять конкреный тексель, и записать в него усрезненное значение цвета его соседей. Вот реализации:
|
void cTexture::Blur( int Count ){
D3DSURFACE_DESC DstInfo;
Texture->GetLevelDesc( 0 , &DstInfo );
D3DLOCKED_RECT LockedRectDst , LockedRectSrc;
Texture->LockRect( 0 , &LockedRectDst , 0 , 0 );
DWORD *p32Dst = ( DWORD* )LockedRectDst.pBits;
DWORD *p32Dst_tmp( p32Dst );
unsigned int Red( NULL ) , Green( NULL ) , Blue( NULL );
for( int k( 0 ) ; k < Count ; k++ ){
p32Dst = p32Dst_tmp;
p32Dst += DstInfo.Width + 1;
for( int i( 1 ) ; i < DstInfo.Height - 1 ; i++ ){
for( int j( 1 ) ; j < DstInfo.Width - 1 ; j++ ){
Red = *( unsigned char * )p32Dst;
Red += *( unsigned char * )( p32Dst - 1 );
Red += *( unsigned char * )( p32Dst + 1 );
Red += *( unsigned char * )( p32Dst - DstInfo.Width );
Red += *( unsigned char * )( p32Dst + DstInfo.Width );
Red += *( unsigned char * )( p32Dst + DstInfo.Width + 1 );
Red += *( unsigned char * )( p32Dst + DstInfo.Width - 1 );
Red += *( unsigned char * )( p32Dst - DstInfo.Width + 1 );
Red += *( unsigned char * )( p32Dst - DstInfo.Width - 1 );
Red = ( float )Red / 9;
*( ( unsigned char * )p32Dst ) = Red;
Green = *( ( unsigned char * )p32Dst + 1 );
Green += *( ( unsigned char * )( p32Dst - 1 ) + 1 );
Green += *( ( unsigned char * )( p32Dst + 1 ) + 1 );
Green += *( ( unsigned char * )( p32Dst - DstInfo.Width ) + 1 );
Green += *( ( unsigned char * )( p32Dst + DstInfo.Width ) + 1 );
Green += *( ( unsigned char * )( p32Dst + DstInfo.Width + 1 ) + 1 );
Green += *( ( unsigned char * )( p32Dst + DstInfo.Width - 1 ) + 1 );
Green += *( ( unsigned char * )( p32Dst - DstInfo.Width + 1 ) + 1 );
Green += *( ( unsigned char * )( p32Dst - DstInfo.Width - 1 ) + 1 );
Green = ( float )Green / 9;
*( ( unsigned char * )p32Dst + 1 ) = Green;
Blue = *( ( unsigned char * )p32Dst + 2 );
Blue += *( ( unsigned char * )( p32Dst - 1 ) + 2 );
Blue += *( ( unsigned char * )( p32Dst + 1 ) + 2 );
Blue += *( ( unsigned char * )( p32Dst - DstInfo.Width ) + 2 );
Blue += *( ( unsigned char * )( p32Dst + DstInfo.Width ) + 2 );
Blue += *( ( unsigned char * )( p32Dst + DstInfo.Width + 1 ) + 2 );
Blue += *( ( unsigned char * )( p32Dst + DstInfo.Width - 1 ) + 2 );
Blue += *( ( unsigned char * )( p32Dst - DstInfo.Width + 1 ) + 2 );
Blue += *( ( unsigned char * )( p32Dst - DstInfo.Width - 1 ) + 2 );
Blue = ( float )Blue / 9;
*( ( unsigned char * )p32Dst + 2 ) = Blue;/**/
p32Dst++;
}
p32Dst++;
p32Dst++;
}
}
Texture->UnlockRect( 0 );
}
|
Вот и все!
Смежные вопросы:
Урок
4. Текстурирование. Текстурный менеджер.
Исходные коды. |
|
|