Растровый Эффект 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. Текстурирование. Текстурный менеджер.
Исходные коды.
© 2004-2005 Savardge.ru


Hosted by uCoz