void Camera::renderTexture(engine::ITexture* texture) { Texture* t = dynamic_cast<Texture*>( texture ); assert( t ); t->apply( 0 ); dxSetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); dxSetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); dxSetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); dxSetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); dxSetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); dxRenderRect( 0, 0, _viewPort.Width, _viewPort.Height, white ); }
void Camera::renderTextureAdditive(engine::ITexture* texture) { Texture* t = dynamic_cast<Texture*>( texture ); assert( t ); t->apply( 0 ); dxSetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); dxSetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); dxSetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); dxSetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); dxSetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); _dxCR( dxSetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ) ); _dxCR( dxSetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE ) ); _dxCR( dxSetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE ) ); _dxCR( dxSetRenderState( D3DRS_BLENDOP, D3DBLENDOP_ADD ) ); dxRenderRect( 0, 0, _viewPort.Width, _viewPort.Height, white ); _dxCR( dxSetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ) ); _dxCR( dxSetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ) ); }
void CameraEffect::applyDOF(void) { assert( _effectTexture ); // setup effect parameters _pEffect->SetInt( "quality", _quality ); _pEffect->SetFloat( "weight", _weight ); _pEffect->SetFloat( "screenWidth", float( Engine::instance->screenWidth ) ); _pEffect->SetFloat( "screenHeight", float( Engine::instance->screenHeight ) ); _pEffect->SetTexture( "newImage", _newImage->iDirect3DTexture() ); _pEffect->SetTexture( "argumentImage", _effectTexture->iDirect3DTexture() ); _pEffect->SetTechnique( "DepthOfField" ); // blend new image & depth map into the render target IDirect3DSurface9* iDirect3DSurface; _dxCR( _renderTarget->iDirect3DTexture()->GetSurfaceLevel( 0, &iDirect3DSurface ) ); _dxCR( _rts->BeginScene( iDirect3DSurface, &_viewPort ) ); iDirect3DSurface->Release(); _dxCR( iDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, black, 1.0f, 0L ) ); UINT numPasses; _pEffect->Begin( &numPasses, D3DXFX_DONOTSAVESTATE ); for( UINT iPass = 0; iPass < numPasses; iPass++ ) { _pEffect->BeginPass( iPass ); dxRenderRect( 0, 0, Engine::instance->screenWidth-1, Engine::instance->screenHeight-1, white ); _pEffect->EndPass(); } _pEffect->End(); iDirect3DDevice->SetPixelShader(NULL); _rts->EndScene( D3DX_FILTER_LINEAR ); _pEffect->SetTexture( "newImage", NULL ); _pEffect->SetTexture( "argumentImage", NULL ); }
void CameraEffect::applyBloom(void) { // 1) _renderTarget -> _newImage with BrightPass effect // setup effect _pEffect->SetInt( "quality", _quality ); _pEffect->SetFloat( "weight", _weight ); _pEffect->SetFloat( "screenWidth", float( _renderTarget->getWidth() ) ); _pEffect->SetFloat( "screenHeight", float( _renderTarget->getHeight() ) ); _pEffect->SetTexture( "newImage", _renderTarget->iDirect3DTexture() ); _pEffect->SetTechnique( "BrightPass" ); // render effect IDirect3DSurface9* iDirect3DSurface; _dxCR( _newImage->iDirect3DTexture()->GetSurfaceLevel( 0, &iDirect3DSurface ) ); _dxCR( _rts->BeginScene( iDirect3DSurface, &_viewPort ) ); iDirect3DSurface->Release(); _dxCR( iDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, black, 1.0f, 0L ) ); UINT numPasses; _pEffect->Begin( &numPasses, D3DXFX_DONOTSAVESTATE ); UINT iPass; for( iPass = 0; iPass < numPasses; iPass++ ) { _pEffect->BeginPass( iPass ); dxRenderRect( 0, 0, _renderTarget->getWidth()-1, _renderTarget->getHeight()-1, white ); _pEffect->EndPass(); } _pEffect->End(); _rts->EndScene( D3DX_FILTER_LINEAR ); // 2) setup bloom float filterWidth = float( _renderTarget->getWidth() ); float filterHeight = float( _renderTarget->getHeight() ); Quartector texelKernel[13]; for( int i=0; i<13; i++ ) { texelKernel[i] = Quartector( float( i-6 ) / filterWidth, float( i-6 ) / filterHeight, 0,0 ); } _pEffect->SetVectorArray( "TexelKernel", texelKernel, 13 ); // 3) _newImage -> _renderTarget with HorizontalBloom effect // setup effect _pEffect->SetInt( "quality", _quality ); _pEffect->SetFloat( "weight", _vector[0] ); _pEffect->SetFloat( "screenWidth", float( _renderTarget->getWidth() ) ); _pEffect->SetFloat( "screenHeight", float( _renderTarget->getHeight() ) ); _pEffect->SetTexture( "newImage", _newImage->iDirect3DTexture() ); _pEffect->SetTechnique( "HorizontalBloom" ); // render effect _dxCR( _renderTarget->iDirect3DTexture()->GetSurfaceLevel( 0, &iDirect3DSurface ) ); _dxCR( _rts->BeginScene( iDirect3DSurface, &_viewPort ) ); iDirect3DSurface->Release(); _dxCR( iDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, black, 1.0f, 0L ) ); _pEffect->Begin( &numPasses, D3DXFX_DONOTSAVESTATE ); for( iPass = 0; iPass < numPasses; iPass++ ) { _pEffect->BeginPass( iPass ); dxRenderRect( 0, 0, _renderTarget->getWidth()-1, _renderTarget->getHeight()-1, white ); _pEffect->EndPass(); } _pEffect->End(); _rts->EndScene( D3DX_FILTER_LINEAR ); // 4) _renderTarget -> _newImage with VerticalBloom effect // setup effect _pEffect->SetInt( "quality", _quality ); _pEffect->SetFloat( "weight", _vector[0] ); _pEffect->SetFloat( "screenWidth", float( _renderTarget->getWidth() ) ); _pEffect->SetFloat( "screenHeight", float( _renderTarget->getHeight() ) ); _pEffect->SetTexture( "newImage", _renderTarget->iDirect3DTexture() ); _pEffect->SetTechnique( "VerticalBloom" ); // render effect _dxCR( _newImage->iDirect3DTexture()->GetSurfaceLevel( 0, &iDirect3DSurface ) ); _dxCR( _rts->BeginScene( iDirect3DSurface, &_viewPort ) ); iDirect3DSurface->Release(); _dxCR( iDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, black, 1.0f, 0L ) ); _pEffect->Begin( &numPasses, D3DXFX_DONOTSAVESTATE ); for( iPass = 0; iPass < numPasses; iPass++ ) { _pEffect->BeginPass( iPass ); dxRenderRect( 0, 0, _renderTarget->getWidth()-1, _renderTarget->getHeight()-1, white ); _pEffect->EndPass(); } _pEffect->End(); _rts->EndScene( D3DX_FILTER_LINEAR ); // 5) copy _newImage to _renderTarget with no effect // setup effect _pEffect->SetInt( "quality", _quality ); _pEffect->SetFloat( "weight", _vector[0] ); _pEffect->SetFloat( "screenWidth", float( _renderTarget->getWidth() ) ); _pEffect->SetFloat( "screenHeight", float( _renderTarget->getHeight() ) ); _pEffect->SetTexture( "newImage", _newImage->iDirect3DTexture() ); _pEffect->SetTechnique( "CopySurface" ); // render effect _dxCR( _renderTarget->iDirect3DTexture()->GetSurfaceLevel( 0, &iDirect3DSurface ) ); _dxCR( _rts->BeginScene( iDirect3DSurface, &_viewPort ) ); iDirect3DSurface->Release(); _dxCR( iDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, black, 1.0f, 0L ) ); _pEffect->Begin( &numPasses, D3DXFX_DONOTSAVESTATE ); for( iPass = 0; iPass < numPasses; iPass++ ) { _pEffect->BeginPass( iPass ); dxRenderRect( 0, 0, _renderTarget->getWidth()-1, _renderTarget->getHeight()-1, white ); _pEffect->EndPass(); } _pEffect->End(); _rts->EndScene( D3DX_FILTER_LINEAR ); // reset shaders iDirect3DDevice->SetPixelShader(NULL); _pEffect->SetTexture( "newImage", NULL ); }
void CameraEffect::applyMotionBlur(void) { if( _prevIsEmpty || _weight == 0.0f ) { _prevIsEmpty = false; // setup new image for texture rendering _newImage->apply( 0 ); dxSetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); dxSetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); dxSetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); dxSetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); dxSetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); dxSetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); dxSetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); // render new image in to the previous image IDirect3DSurface9* iDirect3DSurface; _dxCR( _prevImage->iDirect3DTexture()->GetSurfaceLevel( 0, &iDirect3DSurface ) ); _dxCR( _rts->BeginScene( iDirect3DSurface, &_viewPort ) ); iDirect3DSurface->Release(); _dxCR( iDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, black, 1.0f, 0L ) ); dxRenderRect( 0, 0, Engine::instance->screenWidth-1, Engine::instance->screenHeight-1, white ); _dxCR( _rts->EndScene( D3DX_FILTER_LINEAR ) ); // render new image in to the render target _dxCR( _renderTarget->iDirect3DTexture()->GetSurfaceLevel( 0, &iDirect3DSurface ) ); _dxCR( _rts->BeginScene( iDirect3DSurface, &_viewPort ) ); iDirect3DSurface->Release(); _dxCR( iDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, black, 1.0f, 0L ) ); dxRenderRect( 0, 0, Engine::instance->screenWidth-1, Engine::instance->screenHeight-1, white ); _dxCR( _rts->EndScene( D3DX_FILTER_LINEAR ) ); } else { // setup blending of new image & previous image _prevImage->apply( 0 ); _newImage->apply( 1 ); Color w = D3DCOLOR_RGBA( int(255 * _weight), int(255 * _weight), int(255 * _weight), 255 ); dxSetRenderState( D3DRS_TEXTUREFACTOR, w ); dxSetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); dxSetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); dxSetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); dxSetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); dxSetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); dxSetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, 0 ); dxSetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_LERP ); dxSetTextureStageState( 1, D3DTSS_COLORARG0, D3DTA_TFACTOR ); dxSetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT ); dxSetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_TEXTURE ); dxSetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); dxSetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_CURRENT ); dxSetTextureStageState( 2, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); dxSetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE ); // blend new image & prev image into the render target IDirect3DSurface9* iDirect3DSurface; _dxCR( _renderTarget->iDirect3DTexture()->GetSurfaceLevel( 0, &iDirect3DSurface ) ); _dxCR( _rts->BeginScene( iDirect3DSurface, &_viewPort ) ); iDirect3DSurface->Release(); _dxCR( iDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, black, 1.0f, 0L ) ); dxRenderRect( 0, 0, Engine::instance->screenWidth-1, Engine::instance->screenHeight-1, white ); _rts->EndScene( D3DX_FILTER_LINEAR ); // setup rendering of render target _renderTarget->apply( 0 ); dxSetTextureStageState( 0, D3DTSS_TEXCOORDINDEX, 0 ); dxSetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); dxSetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); dxSetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); dxSetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); dxSetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE ); dxSetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); // copy target image into the previous image _dxCR( _prevImage->iDirect3DTexture()->GetSurfaceLevel( 0, &iDirect3DSurface ) ); _dxCR( _rts->BeginScene( iDirect3DSurface, &_viewPort ) ); iDirect3DSurface->Release(); _dxCR( iDirect3DDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, black, 1.0f, 0L ) ); dxRenderRect( 0, 0, Engine::instance->screenWidth-1, Engine::instance->screenHeight-1, white ); _dxCR( _rts->EndScene( D3DX_FILTER_LINEAR ) ); } }