[DX9] ceGUI RTT

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

[DX9] ceGUI RTT

Beitrag von Raven280438 »

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ß
Raven280438
Establishment
Beiträge: 140
Registriert: 03.10.2010, 20:14

Re: [DX9] ceGUI RTT

Beitrag von Raven280438 »

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.

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;
}
Das Problem dabei ist, dass die FPS von ~350 auf ~70 runtergehen. Gibt es eine schnellere Möglichkeit?


Gruß
Antworten