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 ) );
}
Example #3
0
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 );
}
Example #4
0
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 );
}
Example #5
0
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 ) );
    }
}