[Dx9] D3DFMT_R32F [ERLEDIGT]

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

[Dx9] D3DFMT_R32F [ERLEDIGT]

Beitrag 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.
Zuletzt geändert von DomiOh am 20.03.2009, 15:02, insgesamt 1-mal geändert.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [Dx9] D3DFMT_R32F

Beitrag von Aramis »

Ich denke ganz normal einen float4 zurückgeben. Alle Komponenten außer der Rotkanal werden wohl ignoriert.
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [Dx9] D3DFMT_R32F

Beitrag 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.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [Dx9] D3DFMT_R32F

Beitrag 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;
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [Dx9] D3DFMT_R32F

Beitrag 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.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Dx9] D3DFMT_R32F

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [Dx9] D3DFMT_R32F

Beitrag von DomiOh »

Habe den Fehler gefunden.
Das Problem lag beim Auslesen der Daten. Alles Ok.

@Schrompf: Was für ein Alphablending meinst du?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4855
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [Dx9] D3DFMT_R32F [ERLEDIGT]

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Antworten