[Dx9] D3DFMT_R32F [ERLEDIGT]
[Dx9] D3DFMT_R32F [ERLEDIGT]
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.
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.
- Aramis
- Moderator
- Beiträge: 1458
- Registriert: 25.02.2009, 19:50
- Echter Name: Alexander Gessler
- Wohnort: 2016
- Kontaktdaten:
Re: [Dx9] D3DFMT_R32F
Ich denke ganz normal einen float4 zurückgeben. Alle Komponenten außer der Rotkanal werden wohl ignoriert.
Re: [Dx9] D3DFMT_R32F
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:
oder
Beides führt irgendwie nicht zum Erfolg.
Komisch.
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;
}
Code: Alles auswählen
float4 DepthPS(float ZVal : TEXCOORD0)
{
return float4(ZVal,0,0,0);
}
Komisch.
- Aramis
- Moderator
- Beiträge: 1458
- Registriert: 25.02.2009, 19:50
- Echter Name: Alexander Gessler
- Wohnort: 2016
- Kontaktdaten:
Re: [Dx9] D3DFMT_R32F
Hast du dabei auch die Division durch w nicht vergessen?Ich multipliziere die Vertex-Position mit der WorldViewProjection-matrix.
Code: Alles auswählen
out = mul(WVP,in);
out.z /= out.w;
Re: [Dx9] D3DFMT_R32F
Es geht mir dabei nicht um die Divison z/w sondern, wie in dem Paper beschrieben, um die Entfernung von Z zum Near Frustum.
- Schrompf
- Moderator
- Beiträge: 5118
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: [Dx9] D3DFMT_R32F
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.
Re: [Dx9] D3DFMT_R32F
Habe den Fehler gefunden.
Das Problem lag beim Auslesen der Daten. Alles Ok.
@Schrompf: Was für ein Alphablending meinst du?
Das Problem lag beim Auslesen der Daten. Alles Ok.
@Schrompf: Was für ein Alphablending meinst du?
- Schrompf
- Moderator
- Beiträge: 5118
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: [Dx9] D3DFMT_R32F [ERLEDIGT]
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.