Soweit ich weiß, geht das, indem man rechnet:
Code: Alles auswählen
z = sqrt(1-x*x-y*y)
Rekonstruiere ich nun Z und multipliziere ich anschließend noch mit ZS, so ist das Ergebnis "fast" richtig. Allerdings gibt es um den 0 Bereich eine kleine Anomalie und ich bekomme diese weder behoben noch begreife ich überhaupt, was da falsch sein soll.
In dem Screen wird die Z*0.5+0.5 Komponente dargestellt... man Erkennt einen "Sprung" um die 0 Koordinate.
Was ich seltsam finde: Simuliere ich die zwei Komponenten nur, also übergebe im G-Buffer XYZ und ermittel ich dann beim deferred Rendering sign(Z) und berechne daraus dann per XY den Z Wert, tritt der Fehler genauso auf, was nicht ungewöhnlich ist. Aber ungewöhnlich finde ich, wenn ich die Normale unmittelbar vorher nochmal normalisiere, dann klappt es.
Also scheint es darauf hinzudeuten, dass die Pixelnormale im G-Buffer nicht normalisiert ist, aber bevor sie im G-Buffer landet, normalisiere ich sie schon!
Das Texturformat für die Normale ist D3DFMT_A16B16G16R16F.