Seite 1 von 1

[Dx9] D3DFMT_R32F [ERLEDIGT]

Verfasst: 19.03.2009, 20:02
von DomiOh
Hallo,

ich habe ein kleines Problem.
Ich möchte für DeferredShading einen Depth-Buffer berechnen.
Nun steht in den nVidia-Papers, am besten eignet sich dafür ein D3DFMT_R32F-Buffer.

Wie beschreibe ich diesen denn mit einem Pixelshader?
Ein Pixelshader benötigt ja laut HLSL-Referenz als Rückgabewert einen Vector4 (also float4) als typ.

Für den Depth-Buffer habe ich ja nur ein 32bit Float, was eben an den Buffer übergeben werden soll.

Hilfe wäre toll.

Re: [Dx9] D3DFMT_R32F

Verfasst: 19.03.2009, 20:25
von Aramis
Ich denke ganz normal einen float4 zurückgeben. Alle Komponenten außer der Rotkanal werden wohl ignoriert.

Re: [Dx9] D3DFMT_R32F

Verfasst: 19.03.2009, 20:32
von DomiOh
Hm... Komisch - irgendwie funktioniert das nicht so wie es soll.

Na dann mach ich wohl nen Berechnungsfehler beim Shader.
Merkwürdig.

Ich multipliziere die Vertex-Position mit der WorldViewProjection-matrix.
Übergebe die z-Komponente der Position per float an TEXCOORD0 für den PS.

der PS sieht dann so aus:

Code: Alles auswählen

float4 DepthPS(float ZVal : TEXCOORD0)
{
 return ZVal;
}
oder

Code: Alles auswählen

float4 DepthPS(float ZVal : TEXCOORD0)
{
 return float4(ZVal,0,0,0);
}
Beides führt irgendwie nicht zum Erfolg.
Komisch.

Re: [Dx9] D3DFMT_R32F

Verfasst: 19.03.2009, 21:08
von Aramis
Ich multipliziere die Vertex-Position mit der WorldViewProjection-matrix.
Hast du dabei auch die Division durch w nicht vergessen?

Code: Alles auswählen

out = mul(WVP,in);
out.z /= out.w;

Re: [Dx9] D3DFMT_R32F

Verfasst: 19.03.2009, 21:19
von DomiOh
Es geht mir dabei nicht um die Divison z/w sondern, wie in dem Paper beschrieben, um die Entfernung von Z zum Near Frustum.

Re: [Dx9] D3DFMT_R32F

Verfasst: 19.03.2009, 23:51
von Schrompf
Beide Shader-Varianten müssten klappen. Der Fehler liegt demnach sicherlich woanders. Oder Du versuchst, AlphaBlending zu benutzen, obwohl die Grafikkarte (Geforce bis 7xxx-Seria, ATI bis 2xxx-Serie) das nicht unterstützt.

Re: [Dx9] D3DFMT_R32F

Verfasst: 20.03.2009, 14:53
von DomiOh
Habe den Fehler gefunden.
Das Problem lag beim Auslesen der Daten. Alles Ok.

@Schrompf: Was für ein Alphablending meinst du?

Re: [Dx9] D3DFMT_R32F [ERLEDIGT]

Verfasst: 20.03.2009, 22:28
von Schrompf
AlphaBlending war eine Vermutung. Das ist ein Renderstate und kein Shader-Code, lag also außerhalb der Schnipsel, die Du gepostet hast. Aber AlphaBlending funktioniert halt nicht auf 32Bit-Float-Rendertargets, wenn man eine minimal ältere Grafikkarte hat. Daher meine Bemerkung, dass es auf älteren Grafikkarten nicht funktionieren wird, wenn Du irgendwas mit AlphaBlending vor hast.