MRT Problem

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
DeRaaZuul
Beiträge: 15
Registriert: 19.03.2008, 00:25

MRT Problem

Beitrag von DeRaaZuul »

Guten Morgen an alle ,
ich sitze nun fast 6 std lang an meinem Problem fest und es treibt mich in den Wahnsinn so langsam ^^
Mein Problem bezieht sich auf Multiple Render Targets.Ich lasse ein Fullscreen-Quad rendern und dabei habe ich 3 Rendertargets "an".Nachdem das Quad geredent ist , entbinde ich die Rendertargets und lasse nochmal ein Fullscreen-Quad rendern , wobei ich das erste Rendertarget als Texture binde.Wenn ich nur 1 Rendertarget benutze , läuft alles super , schalte ich aber ein weiteres dazu oder wie hier im Bsp. 3 , ist der Inhalt aller Rendertargets schwarz.Ich benutze dazu DirectX9 und Vista.Meine GFX-Karte(Geforce 8600) habe ich positiv auf die Möglichkeit MRT´s zu benutzen getestet und PIX war mir leider auch keine Hilfe.

Code: Alles auswählen

//Hier mein Code wo die 3 Targets gebunden werden
// Parameter = Stage
	m_pTexture1->bindTextureAsRenderTarget(0);
	m_pTexture2->bindTextureAsRenderTarget(1);
	m_pTexture3->bindTextureAsRenderTarget(2);

	m_pFXFile->bindTechnique("ClearScreen");
	m_pFXFile->bindPass(0);

//true = Löche den Bildschierm
		pRenderer->begin3DScene(true);
		{
//Hierbei handelt es sich um das Fullscreen-Quad
				m_pQuad->drawQuad();
		}
//true = Zeige die Scene mit Present an
		pRenderer->end3DScene(true);

	m_pFXFile->unbindAll();

        m_pTexture1->deactivateTextureAsRenderTarget();
	m_pTexture2->deactivateTextureAsRenderTarget();
	m_pTexture3->deactivateTextureAsRenderTarget();	

//Hier die Methode bindTextureAsRenderTarget im Detail
bindTextureAsRenderTarget(unsigned int uiIndex)
	{
		if(m_bRenderTarget)
		{
			m_uiIndex						= uiIndex;

			if(NULL == m_lpDepthBuffer|| NULL == m_lpBackBuffer)
				return;

			if( 0 == uiIndex )
			{

				if(FAILED(m_lpDevice->SetDepthStencilSurface(m_lpDepthBuffer)))
					return;

				m_lpDevice->GetViewport(&m_OldViewPort);
				m_lpDevice->SetViewport(&m_ViewPort);
			}
			if(FAILED(m_lpDevice->SetRenderTarget(uiIndex,m_lpBackBuffer)))
				return;
		}

//Und zur sicherheit hier mein Shader
float4x4 g_matWorldViewProj;
texture Texture0;
sampler2D SamplerTexture0 = sampler_state
{
	Texture = (Texture0);
};

struct PS_OUTC123
{
	float4 Col0 : COLOR0;
	float4 Col1 : COLOR1;
	float4 Col2 : COLOR2;
};

struct VS_OUTP0
{
	float4 Pos : POSITION0;
};

VS_OUTP0 VS_SimpleTransform(
								float4 inPos : POSITION0)
{
	VS_OUTP0 Out;
	Out.Pos			= mul(inPos,g_matWorldViewProj);
	
	return Out;
}

PS_OUTC123 PS_ClearScene(VS_OUTP0 In)
{
	PS_OUTC123 Out = (PS_OUTC123)0;
	Out.Col0	= float4(1,0,0,0);
	Out.Col1	= float4(0.5f,0.5f,0.5f,1);
	Out.Col2	= float4(0,0,1,0);
	return Out;
}

technique ClearScreen
{
    pass P0
    {
          VertexShader = compile vs_2_0 VS_SimpleTransform();
          PixelShader = compile ps_2_0 PS_ClearScene();
    }
}

Als ich alles im Debugger durchgelaufen bin , gab es an keiner Stelle einen Fehler :(

Bye bye
Benutzeravatar
Richard Schubert
Moderator
Beiträge: 106
Registriert: 27.02.2009, 08:44
Wohnort: Hohen Neuendorf (b. Berlin)
Kontaktdaten:

Re: MRT Problem

Beitrag von Richard Schubert »

Bindest du die Textur, welche du im Shader verwendest als Rendertarget zur selben Zeit? Wenn das so ist, kann das undefinierte Ergebnisse liefern. Wenn dem nicht so ist, dann hab ich dich missverstanden. Vielleicht wäre dann ein genauerer Ablauf/Codeausschnitt hilfreich in dem der Fehler passiert.
Produktivität über Performance - XNA Creators Club
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: MRT Problem

Beitrag von Jörg »

Hast Du mal die DEBUG-Runtime aktiviert und den Output-Level auf Maximum gestellt?
Hast Du alle Einschraenkungen beachtet, die fuer MRTs zutreffen koennen (ja nach Karte, siehe Doku)?
Was macht das Ref-Device?
DeRaaZuul
Beiträge: 15
Registriert: 19.03.2008, 00:25

Re: MRT Problem

Beitrag von DeRaaZuul »

Also ich benutze die Texture als RenderTarget und dann entbinde ich sie als RenderTarget und benutze sie als normale texture.Mit der DEBUG-Runtime habe ich noch nie gearbeitet und deshalb jetzt mal versucht.Mir sind da paar Merkwürdige Sachen aufgefallen oO Nachdem ich meine RenderDevice erstellt habe , und den BackBuffer geholt habe , sind z.B. die Daten im BackBuffer beim "Debugen" verschoben.Beim MipMap Lvl des BackBuffer steht die Breite der Auflösung und beim Priority Wert die Höhe der Auflösung.Bei den Werten für die RenderTargets ist es das gleiche.Die Breite der RenderTargets soll angeblich 77678 sein , obwohl das erstellen keine Fehler gezeigt hat???Kann es sein das ich irgendwo ein Speicherleck habe das das Verursacht , oder benutze die die DEBUG-Runtime falsch?Ich habe einfach bevor ich die <d3d9.h> einbinde #define D3D_DEBUG_INFO geschrieben.Ausser den RenderTargets läuft alles normal?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4852
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: MRT Problem

Beitrag von Schrompf »

Die Debug-Runtime aktivierst Du schlicht über das DirectX-Control Panel (irgendwo im Startmenü unter DX-SDK/Utilities). Danach bekommst Du viele schöne Debug-Meldungen ins VisualStudio-Ausgabefenster, je nachdem wie hoch Du in diesem Panel das Debuglevel eingestellt hast. An Deinem Programm musst Du dazu gar nix ändern, auch wenn die Definition dieses DEBUG-Makros (vor allen Includes) wohl noch ein paar zusätzliche Möglichkeiten freischalten soll.

Das Debug-Level auf dem höchsten Niveau müllt Dir übrigens die Ausgabe mit abertausenden von "Redundant Renderstate"-Meldungen zu... ein mittleres Debuglevel reicht meines Erachtens völlig aus, und Fehler wie Deinen müsste die Debug-Runtime auf jedem beliebigen Level finden und melden.

Mein Tipp zur Fehlerursache: ich vermute, Deine Rendertargets haben keine kompatiblen Formate. Die Bedingungen an die Rendertargets stehen in der DX-Doku unter D3D9 -> Programming Guide -> Advanced Topics -> Pixel Pipeline -> Multiple Render Targets. In Kurzform: jedes Rendertarget muss ein Format haben, dass von der Bitgröße her identisch mit den anderen Formaten ist. Also A8R8G8B8 und G16R16F gehen zusammen, weil beide 32Bit pro Pixel haben. Aber G16R16F und A16B16G16R16F gehen nicht zusammen, weil letzteres 64Bit pro Pixel hat. Außerdem wird unter DX9 für MRTs kein Antialiasing unterstützt. Und die Rendertargets müssen alle die selbe Größe haben. Bei dem bin ich mir nicht ganz sicher, was die Doku dazu meint - vielleicht reicht auch nur, dass der Viewport für alle die selbe Größe haben muss. Aber so wie ich die Doku verstehe, müssen die Rendertargets wohl tatsächlich die selbe Größe haben.

Bye, Thomas
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
DeRaaZuul
Beiträge: 15
Registriert: 19.03.2008, 00:25

Re: MRT Problem

Beitrag von DeRaaZuul »

Supppper :D Danke für die erklärung wie man die Debug-Runtime benutzt.Dieses hat mir auch flott angezeigt das "MultiSampleType " beim RenderTarget und beim Backbuffer anderes sind.Yupiii endlich , ihr könnt euch gar nicht vorstellen wie mich das gewurmt hat!Viele dank an alle!
Benutzeravatar
Krishty
Establishment
Beiträge: 8237
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: MRT Problem

Beitrag von Krishty »

Kann jemand eine bebilderte FAQ zum aktivieren der Debug-Runtime erstellen? Dann bräuchte in Zukunft nurnoch darauf verwiesen und die Anleitung nicht jedes Mal neu geschrieben werden :)

Da kann das Wissen dann auch gesammelt werden (z.B. ist noch recht wichtig, dass man die Debug-Runtime nach dem Debuggen wieder abschalten sollte, weil sonst viele Spiele nicht mehr starten – arbeitet ja nicht jeder so sauber wie wir hier ;) ) …

… ich kann mich erinnern, dass es in den FAQ des „alten“ ZFX sowas gab, finde es dort aber nicht mehr …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten