(erledigt) HDR-Texturfilterung

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

(erledigt) HDR-Texturfilterung

Beitrag von Krishty »

Hi,

Mal wieder eine Frage zu HDR-Rendering. Diesmal betrifft es die Texturfilterung: wie filtert man Texturen, die im Linear-Space vorliegen, korrekt?

Texturen, die mit Gammakorrektur vorliegen, werden zwischen den Texeln linear interpoliert. Werden sie nach dem Sampling im Shader in den Linear-Space konvertiert, wird diese Interpolation nichtlinear – beim Tonemapping wird das aber wieder ausgeglichen und der endgültige Helligkeitsverlauf ist wieder linear. Es sieht aus, wie man es gewohnt ist:
Textur mit Gamma
Textur mit Gamma
HDR-Texturen, die bereits im Linear-Space vorliegen, werden zwischen den Texeln ebenfalls linear interpoliert. Da sie aber im Shader nicht mehr nachkorrigiert werden müssen, ist der endgültige Helligkeitsverlauf nach Tonemapping nichtlinear, es bilden sich Blöcke:
Lineare Textur
Lineare Textur
Wie kann man Blockbildung bei Filterung von Texturen im Linear-Space vermeiden?

Gruß, Ky
Zuletzt geändert von Krishty am 22.07.2009, 23:21, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Jörg »

Ja, das ist komisch. Welches API verwendest Du (D3D9 oder 10) und welche Karte?
SRGB-Texturen sollten (sofern entweder der Renderstate oder das Format richtig gesetzt sind, vor dem Filtern linearisiert werden, bei DX9 darf es aber auch mal andersrum sein)...
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Schrompf »

Das ist mathematisch das korrekte Ergebnis... aber ich habe keine Ahnung, wie man dem beikommen könnte. Außer das Filtern selbst im PixelShader zu machen. Und das dürfte kaum erstrebenswert sein.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Krishty »

Jörg hat geschrieben:Welches API verwendest Du (D3D9 oder 10) und welche Karte?
D3D11 mit SM 4.1 auf einer Radeon HD 4850.
Jörg hat geschrieben:Ja, das ist komisch. […] SRGB-Texturen sollten (sofern entweder der Renderstate oder das Format richtig gesetzt sind, vor dem Filtern linearisiert werden, bei DX9 darf es aber auch mal andersrum sein)...
Eigentlich ist es perfekt logisch, weil es sich nicht um sRGB-Texturen handelt (die werden für MDR- und HDR-Formate wie DXGI_FORMAT_R16G16B16A16_FLOAT nicht angeboten. In diesem Format sind auch die Texturen auf den beiden Screenshots).
Schrompf hat geschrieben:Das ist mathematisch das korrekte Ergebnis... aber ich habe keine Ahnung, wie man dem beikommen könnte. Außer das Filtern selbst im PixelShader zu machen. Und das dürfte kaum erstrebenswert sein.
Ja, man müsste quasi das Ergebnis des Tonemappings schon beim Samplen der Texturen kennen … die Sache ist aber, dass das mit der zunehmenden Verbreitung von HDR immer relevanter werden müsste. Anisotropes Filtern z.B. wird auf linearen Texturen auch problematisch werden – ich habe es noch nicht testen können, aber es wird sicher eine Klasse hinter gammakorrigierten Texturen zurückbleiben … über Kurz oder Lang muss also eine Lösung her.

Ich habe schon Google bemüht, allerdings wird meine Suche immer als „linear texture filtering“ misinterpretiert, weil die Ähnlichkeit eben zu groß ist :(
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Jörg »

Ah du konvertierst _im_ Shader nach, das hab ich ueberlesen, und damit ist ja alles korrekt(bzw. so wie dargestellt).
Warum konvertierst Du nicht die Texturen vorher (die LDRs) ? Dann erhaeltst Du bei beiden das gleiche Ergebnis (im Einklang mit den Methoden zum Alphablenden im linearen Space), sparst den Shader-Befehl und kannst evtl. dein Tonemapping mit einer nachgeschalteten Gamma-Korrektur in den Griff bekommen?
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Krishty »

Jörg hat geschrieben:Warum konvertierst Du nicht die Texturen vorher (die LDRs) ?
Wie meinen? Die Texturen offline in den Linear-Space konvertieren? Dann kommt dabei die Blockbildung von Screenshot zwei raus.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Jörg »

Ja freilich, aber dann waeren beide Faelle identisch im Ergebnis (ist ja auch was...). Wie gesagt, was "richtig" und "falsch" ist, kann man nicht so einfach sagen (ganz aus der Luft gegriffen sind ja die Annahmen von DX und OpenGL bezueglich "erst linearisieren, dann filtern" nicht).
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Krishty »

Okay, aber welche Möglichkeiten - abgesehen von Supersampling und einem 2x2er-Gauss über jede Textur - gibt es, um mit linearen Texturen die gleiche befriedigende Bildqualität zu erreichen wie mit konventionellen Texturen bei LDR-Rendering?

Antialiasing hat ja genau das gleiche Problem ... aber es ist lösbar, indem man die Samples erst nach dem Tonemapping auflöst. Beim Texture-Filtering findet diese Auflösung der einzelnen Samples aber schon beim Laden statt ...
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Jörg »

Wie du sagst, SuperSampling der Texturen (sprich einfach ne hoehere Aufloesung bereitstellen, richtig kritisch wird es ja nur bei extremen Unterschieden der Pixel) ist wohl der Standardweg. Jede Engine, die heute was auf sich haelt, bietet Streaming (oder aufloesungsflexible prozedurale Generierung) von Texturen, so nach dem Motto: Wenn es stoert, kommt ein Texturelevel mehr dazu.
Wie sehr macht sich der Unterschied denn in einer echten Umgebung bemerkbar?
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Krishty »

Jörg hat geschrieben:Wie du sagst, SuperSampling der Texturen (sprich einfach ne hoehere Aufloesung bereitstellen, richtig kritisch wird es ja nur bei extremen Unterschieden der Pixel) ist wohl der Standardweg. Jede Engine, die heute was auf sich haelt, bietet Streaming (oder aufloesungsflexible prozedurale Generierung) von Texturen, so nach dem Motto: Wenn es stoert, kommt ein Texturelevel mehr dazu.
Mehr Texel sind ja auch nicht zwingend besser, denn der Mag-Filter wird genauso sperrige Ergebnisse erzeugen wie der Min-Filter (es ist zwar nicht mehr blockig, aber es flimmert mehr (okay, wenn man sich so manche Engine anschaut, stört das wohl keine Sau außer mir)). Andersrum, man muss die Auflösung beibehalten und den Inhalt der Textur eine Stufe runterschalten, damit er niederfrequenter wird.
Jörg hat geschrieben:Wie sehr macht sich der Unterschied denn in einer echten Umgebung bemerkbar?
Das interessiert mich auch brennend, sobald ich (heute abend) an ein fähiges System komme, teste ich das.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Krishty »

Voilà l´sRGB:
sRGB.png
Et linéaire:
Linear.png
Die Textur habe ich auf die Schnelle aus dem Internet geklaut, skaliert (kubisch von 1029×1000 auf 1024×1024) und einen leichten Blur drübergejagt (Gauss von 0,7 Pixel, weil die Kanten beim Original geschärft waren), sie ist also garnicht mal sooo hochfrequent …

… beim Großteil der Textur ist der Unterschied tatsächlich verschwindend gering (und das Ausschwimmen der hellen Bereiche fällt kaum auf), trotzdem sehen die Konturen bei der linearen Version aus wie Point-Filtering.

Ich kam leider noch nicht dazu, Mip-Mapping zu implementieren, lasst also die Ränder der Kugel unbeachtet!

Und hier nochmal die ungnädigere 512×512-Version, sRGB:
sRGB512.png
Und linear:
Linear512.png
Da kommt es dann aber wirklich durch, da wird das Bleeding der hellen Flächen auch langsam zum Problem.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Zudomon »

Also um ehrlich zu sein, so extrem finde ich das nicht, als das ich dafür extra Rechenzeit wie etwa eigenes Filtern in kauf nehmen würde. ;)
Aber vielleicht könntest du ja mal Differenzbilder hochladen.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Schrompf »

Jupp, ich sehe da auch keinen Unterschied, der es nach meinem Empfinden wert wäre, dafür Fillrate zu opfern. Aber ich erinnere mich, dass Du da etwas anspruchsvoller bist :-)
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Krishty »

Zudomon hat geschrieben:Aber vielleicht könntest du ja mal Differenzbilder hochladen.
Beide Bilder in Tabs öffnen, ein Tab markieren und dann mit den Pfeiltasten hin- und herswitchen, meine Güte ;)

Aber nagut, weil ihr es seid, 1024²
Diff1024.png
und 512²
Diff512.png
Habe einfach beide Bilder im Gimp eingefügt und als Blend-Methode „Difference“ ausgewählt – ich hoffe, das war richtig.

Bis zu Helligkeitssprüngen von rund 50% ist wirklich kaum etwas erkennbar … darüber geht es aber dann in Richtung Point-Filtering.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 13:06
Wohnort: Trondheim
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Jörg »

Danke für die Arbeit, aber ich könnte damit leben :) Sieht bei weitem nicht so grässlich aus wie die Laborbeispiele ...
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Krishty »

Okay, wenn ihr da geschlossen keinen Handlungsbedarf seht, sollte ich es wohl dabei belassen … jedenfalls wieder mal danke für die Beratung :)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: HDR-Texturfilterung

Beitrag von Zudomon »

Krishty hat geschrieben:
Zudomon hat geschrieben:Aber vielleicht könntest du ja mal Differenzbilder hochladen.
Beide Bilder in Tabs öffnen, ein Tab markieren und dann mit den Pfeiltasten hin- und herswitchen, meine Güte ;)
Das ist mir schon klar, aber so ein Differenzbild ist meiner Meinung nach Aussagekräftiger.

Aber auch hier muss ich sagen, der Unterschied ist garnicht so extrem groß.
Kannst dir das ja auf deine ToDo Liste an letzter Stelle schreiben. :D
Antworten