Skip to main content
gamedev.net
🔒 Locked

Problem with rendering to texture

Started by Promethium 1 reply 1k views
Original Post
Promethium
Promethium
I'm trying to use a texture as a render target in DX9, but the result is just a completly black texture. I've made this helper class:

[.h]
class RenderTarget {
public:
    RenderTarget( LPDIRECT3DDEVICE9 device, UINT width, UINT height );
    ~RenderTarget();

    void Enable();
    void Disable();

    const LPDIRECT3DTEXTURE9& Texture() { return mRenderTexture; }

    void Save( const std::string& filename ) const;

private:
    LPDIRECT3DDEVICE9 mDevice;
    LPDIRECT3DTEXTURE9 mRenderTexture;
    LPDIRECT3DSURFACE9 mRenderSurface;
    LPDIRECT3DSURFACE9 mBackBuffer;

    UINT mWidth;
    UINT mHeight;
};

[.cpp]
RenderTarget::RenderTarget( LPDIRECT3DDEVICE9 device, UINT width, UINT height ) 
    : mDevice( device )
    , mRenderTexture( 0 )
    , mRenderSurface( 0 )
    , mBackBuffer( 0 )
    , mWidth( width )
    , mHeight( height )
{
    assert( mWidth );
    assert( mHeight );

    HRESULT hr = mDevice->CreateTexture( mWidth, mHeight, 1, D3DUSAGE_RENDERTARGET, 
        D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &mRenderTexture, 0 );
    if( FAILED( hr ) )
        throw Exception( "Could not create texture" );

    hr = mRenderTexture->GetSurfaceLevel( 0, &mRenderSurface );
    if( FAILED( hr ) )
        throw Exception( "Could not get texture surface" );
}

RenderTarget::~RenderTarget() {
    if( mBackBuffer )
        Disable();

    if( mRenderSurface )
        mRenderSurface->Release();

    if( mRenderTexture )
        mRenderTexture->Release();
}   

void RenderTarget::Enable() {
    HRESULT hr = mDevice->GetRenderTarget( 0, &mBackBuffer );
    if( FAILED( hr ) )
        throw Exception( "Could not get render target" );

    hr = mDevice->SetRenderTarget( 0, mRenderSurface );
    if( FAILED( hr ) )
        throw Exception( "Could not set render target" );
}

void RenderTarget::Disable() {
    assert( mBackBuffer );

    HRESULT hr = mDevice->SetRenderTarget( 0, mBackBuffer );
    if( FAILED( hr ) )
        throw Exception( "Could not set render target" );

    mBackBuffer->Release();
    mBackBuffer = 0;
}

void RenderTarget::Save( const std::string& filename ) const {
    HRESULT hr = D3DXSaveSurfaceToFile( filename.c_str(), D3DXIFF_PNG, mRenderSurface, 0, 0 );
    if( FAILED( hr ) )
        throw Exception( "Could not save texture to " + filename );
}


I then use it like this:

gRenderTarget->Enable();
gDevice->Clear( 0, 0, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, from_argb( 0, 0, 255 ), 1, 0 );
gDevice->BeginScene();

// Do some simple rendering
RenderCube();

gDevice->EndScene();
gRenderTarget->Disable();


This should cause the texture I use as render target to become blue with a cube in the center. However if I try to use it, or save it to a file it's just black. Can anyone help me figuring out what I am missing?
Promethium
Promethium
No, not as far as I can tell.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.