Hi,
ich bin dabei eine 2d Engine zu schreiben, dazu benutze ich unter Anderem ceGUI.
Nun hab ich eine Texture gerendert und möchte diese in einem ceGUI-Window anzeigen.
Wie bekomm ich das am Besten hin?
Gruß
[DX9] ceGUI RTT
-
- Establishment
- Beiträge: 140
- Registriert: 03.10.2010, 20:14
Re: [DX9] ceGUI RTT
Hi,
mittlerweile hab ich rausgefunden, dass man eine Texture mit ceGUI mit Hilfe von loadFromMemory laden kann.
Ich habe in meinem DX9 Renderer eine Methode geschrieben, die einen solchen Memory-Stream erstellen kann.
Das Problem dabei ist, dass die FPS von ~350 auf ~70 runtergehen. Gibt es eine schnellere Möglichkeit?
Gruß
mittlerweile hab ich rausgefunden, dass man eine Texture mit ceGUI mit Hilfe von loadFromMemory laden kann.
Ich habe in meinem DX9 Renderer eine Methode geschrieben, die einen solchen Memory-Stream erstellen kann.
Code: Alles auswählen
void* DX9Renderer::GetMemoryStream(Stengine::Renderer::CTexture* target)
{
if (this->RenderTargetsTextures.count(target) > 0)
{
HRESULT hr;
LPDIRECT3DSURFACE9 renderTarget;
hr = this->RenderTargetsTextures[target]->GetSurfaceLevel(NULL,&renderTarget);
if (FAILED(hr))
{
CRENDEREREXCEPTION(L"Fehler beim Erstellen des Render-Surfaces!",L"DX9Renderer::GetMemoryStream()");
return NULL;
}
D3DSURFACE_DESC rtDesc;
renderTarget->GetDesc( &rtDesc );
LPDIRECT3DSURFACE9 resolvedSurface;
if( rtDesc.MultiSampleType != D3DMULTISAMPLE_NONE )
{
hr = this->pxD3DDevice->CreateRenderTarget( rtDesc.Width, rtDesc.Height, rtDesc.Format, D3DMULTISAMPLE_NONE, 0, FALSE, &resolvedSurface, NULL );
if(FAILED(hr))
{
CRENDEREREXCEPTION(L"Fehler beim Erstellen des Resolved-Surfaces!",L"DX9Renderer::GetMemoryStream()");
return NULL;
}
hr = this->pxD3DDevice->StretchRect( renderTarget, NULL, resolvedSurface, NULL, D3DTEXF_NONE );
if(FAILED(hr))
{
CRENDEREREXCEPTION(L"Fehler beim Strecken des Resolved-Surfaces!",L"DX9Renderer::GetMemoryStream()");
return NULL;
}
renderTarget = resolvedSurface;
}
LPDIRECT3DSURFACE9 offscreenSurface;
hr = this->pxD3DDevice->CreateOffscreenPlainSurface( rtDesc.Width, rtDesc.Height, rtDesc.Format, D3DPOOL_SYSTEMMEM, &offscreenSurface, NULL );
if(FAILED(hr))
{
CRENDEREREXCEPTION(L"Fehler beim Erstellen des OffscreenPlainSurfaces!",L"DX9Renderer::GetMemoryStream()");
return NULL;
}
hr = this->pxD3DDevice->GetRenderTargetData( renderTarget, offscreenSurface );
if (FAILED(hr))
{
CRENDEREREXCEPTION(L"Fehler beim Holen der RenderTarget-Daten!",L"DX9Renderer::GetMemoryStream()");
return NULL;
}
D3DLOCKED_RECT lr;
RECT rect;
rect.left = 0;
rect.right = rtDesc.Width;
rect.top = 0;
rect.bottom = rtDesc.Height;
// Lock the surface to read pixels
hr = offscreenSurface->LockRect( &lr, &rect, D3DLOCK_READONLY );
if( SUCCEEDED(hr) )
{
offscreenSurface->UnlockRect();
return lr.pBits;
}
else
{
return NULL;
}
}
return NULL;
}
Gruß