[ERLEDIGT] [DX9] Deferred Shading und Normal-Maps

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

[ERLEDIGT] [DX9] Deferred Shading und Normal-Maps

Beitrag von DomiOh »

Die Probleme mit dem deferred Shading hören einfach nicht auf.
Jetzt habe ich ein Problem mit den Normal-Maps und habe mich durch Google gewühlt.
Bei vielen anderen scheint das zu funktionieren, bei mir jedoch nicht.
Ich möchte gerne in meinem G-Buffer die Normalen vorberechnen indem ich sie direkt mit der
Tangent-Space Matrix (oder der transponierten Tangent-Space Matrix) multipliziere.

Das funktioniert aber vorne und hinten nicht. Schon die Normal-Map sieht etwas merkwürdig aus.

Interessanter Weise passt die Normal-Map in Blickrichtung, nicht jedoch auf dem Boden...
Und ich finde den Fehler nicht.

Sieht jemand einen Fehler in diesem Shader-Code?

Code: Alles auswählen

float4x4		wvp;				// WorldViewProjection
sampler2D		tex0 : register(s0);		// Albedo-Textur
sampler2D		nMap : register(s7);		// Normal-Map

struct vs_out
{
	float4			Pos : POSITION;
	float2			TC0 : TEXCOORD0;
	float4			Col : COLOR0;
	float4			PosX: TEXCOORD7;
	float3			Tng : TEXCOORD2;
	float3			BNrm: TEXCOORD3;
	float3			Nrm : TEXCOORD4;
};

struct vs_in
{
	float4			Pos : POSITION;
	float2			TC0 : TEXCOORD0;
	float4			Col : COLOR0;
	float3			Nrm : NORMAL;
	float3			Tng : TANGENT;
	float3			BNrm: BINORMAL;	
};

struct ps_in
{
	float2			TC0 : TEXCOORD0;
	float4			Col : COLOR0;
	float4			Pos : TEXCOORD7;
	float3			Tng : TEXCOORD2;
	float3			BNrm: TEXCOORD3;
	float3			Nrm : TEXCOORD4;
};

struct ps_out
{
	float4			c0 : COLOR0;		// Albedo
	float4			c1 : COLOR1;		// Normals
	float4			c2 : COLOR2;		// World-Space-Position
};

///

vs_out VS(vs_in ix)
{
	vs_out ox;
	
	ox.Pos = mul(ix.Pos, wvp);
	ox.TC0 = ix.TC0;
	ox.Col = ix.Col;
	ox.PosX = ix.Pos;	
 	ox.Tng = ix.Tng;
	ox.BNrm= ix.BNrm;
	ox.Nrm = ix.Nrm;
	
	return ox;
}

ps_out PS(ps_in ix)
{
	ps_out ox;
	
	float3 bumpedNormal = tex2D(nMap, ix.TC0) * 2.f - 1.0f;

	float3x3 tSpace = transpose(float3x3(ix.Tng, ix.BNrm, ix.Nrm));
	ox.c1 = float4(normalize(mul(bumpedNormal, tSpace)),1);

	ox.c0 = tex2D(tex0, ix.TC0);
	ox.c2 = ix.Pos;
	return ox;
}
Zuletzt geändert von DomiOh am 13.10.2009, 00:37, insgesamt 1-mal geändert.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [DX9] Deferred Shading und Normal-Maps

Beitrag von Zudomon »

Hilfreicher wären Screens...
von der Normalmap (da du ja sagst, dass schon diese merkwürdig aussieht) und vom Normalenkanal.
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [DX9] Deferred Shading und Normal-Maps

Beitrag von DomiOh »

So jetzt komme ich endlich dazu, mal die Screens zu posten.
Da habe ich mich falsch ausgedrückt - die Normalmap sieht normal aus, nur das Ergebnis im Normals-Kanal sieht merkwürdig aus.
Man beachte vor allem den Boden.
Das ganze ist normalerweise in einem signed Float Format gespeichert, ich habe es nur für den Screen mit (Normal + 1) / 2 so umgerechnet, dass die Map komplett zu sehen ist.

Hier die Normalmap:
Bild

Und der der Normals-Channel:
Bild

während die Decke, die Wand hinten und die Wand rechts aussieht, als wären die Normals richtig, sieht der Boden etwas merkwürdig aus.
Auch die Berechnung der Tangenten scheint richtig, ich habe diese sowohl von DirectX (D3DXComputeTangentFrame) errechnen lassen, als auch selbst errechnet. Beides bringt das selbe falsche Ergebnis.
Ich sollte dazu sagen, dass im Moment diese Normalmap auf alle Objekte gerechnet wird. Auch auf den Boden. Aber dort ist die Normalmap nicht als solche zu erkennen...
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [DX9] Deferred Shading und Normal-Maps

Beitrag von Zudomon »

Da läuft irgendwas extrem schief.

Der Fehler selbst ist auch nicht konsistent, also z.B. ist die Decke rosa, der Türrahmen innen und im Hintergrund die Oberseite an den Kesseln auch.
Vielleicht solltest du nochmal 3 Screens nachlegen. :D
Und zwar diesmal von den Normalen-, Tangent- und Binormalenkanal. (Also die Vertexnormalen, nicht die mit der Textur verrechneten)
Vielleicht noch einen Vierten, wo du nur die Normalmap aktiviert hast, ohne die in Weltkoordinaten umzurechnen, am besten etwas näher an dem verrauschten Boden, um mal zu sehen, ob die Texturen da vernünftig gemappt werden.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [DX9] Deferred Shading und Normal-Maps

Beitrag von CodingCat »

@DominOh
Dein Shader-Code verwirrt mich total, ich sehe da keine einzige Transformation in ein konsistents Koordinatensystem, vielmehr scheint es mir, als ob du Positionen und Normalen einfach im Objektspace belässt?
Zudem ist mir unklar, wieso du die Tangentenmatrix transponierst.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [DX9] Deferred Shading und Normal-Maps

Beitrag von DomiOh »

Richtig, ich belasse alle Positionen und Normalen im Objektspace. Weil ich auf diese Art meinen G-Buffer fülle.
Alle Umrechnungen kommen später im Light-Shader.
Dennoch sollten die Normalen korrekt umgerechnet werden.

Das mit dem transponieren stammt aus ShaderX2. Auch wenn ich die Tangentspace-Matrix nicht transponiere sind die Normalen fehlerhaft.
In ShaderX2 steht, dass man diese Matrix eine Tangentspace-To-Objectspace - Matrix ist.
Das ganze funktioniert ja auch, solange die Tangenten nicht mit eingerechnet werden.

Die Screens liefere ich heute Abend nach...
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [DX9] Deferred Shading und Normal-Maps

Beitrag von CodingCat »

DomiOh hat geschrieben:Richtig, ich belasse alle Positionen und Normalen im Objektspace. Weil ich auf diese Art meinen G-Buffer fülle.
Alle Umrechnungen kommen später im Light-Shader.
Und woher weiß dein Light-Shader dann, zu welchem Objekt welcher Pixel gehört, damit er den Pixel in den World Space umrechnen kann? Das kommt mir sehr seltsam vor.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [DX9] Deferred Shading und Normal-Maps

Beitrag von DomiOh »

Der Shader ist ein Entwurf und daher ist das völlig Okay so. Es gibt in dieser Szene keine Geometrie die noch mit einer World-Matrix transformiert werden müsste.
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [DX9] Deferred Shading und Normal-Maps

Beitrag von DomiOh »

Ich habe das Problem lösen können. Es waren 3 leicht zu übersehende Fehler sowohl im Shader als auch im Programmcode.

Und es hatte nichts mit einer Worldmatrix zu tun ;)

Dennoch danke für die Antworten
Antworten