[PS40] Mipmaplevel berechen

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Zudomon
Establishment
Beiträge: 2127
Registriert: 25.03.2009, 08:20
Kontaktdaten:

[PS40] Mipmaplevel berechen

Beitrag von Zudomon » 15.05.2009, 08:22

Hallo,
ich muss im Pixelshader das Mipmaplevel selbst berechnen. Sobald man dynamic branching einsetzt, funktioniert das ja nicht mehr automatisch. :cry:
Dazu kommt, das ich auch ddx() und ddy() nicht benutzen kann, weil diese ebenfalls nicht in einer If-Bedingung funktioniert. Ich kann diese Funktionen auch nicht herausziehen, weil sonst meine Optimierung zunichte gehen würde.

Also was ich brauche wäre, eine einfache, schnelle Funktion, um das ungefähre Mipmaplevel zu berechnen. Zur Verfügung würde der Abstand zur Kamera und die Normale stehen, vielleicht kann man daraus was gescheites bauen.

Vielleicht hat jemand eine Idee...

Gruß
Zudomon

Benutzeravatar
Krishty
Establishment
Beiträge: 7141
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [PS40] Mipmaplevel berechen

Beitrag von Krishty » 15.05.2009, 08:29

Dir bleibt nur, im Geo-Shader aus den transformierten Koordinaten der Vertices und ihren Texturkoordinaten die Änderungsrate selbst zu berechnen.

Im Pixel-Shader ist das bestimmen des Mip-Levels ohne ddx und ddy unmöglich.

Gruß, Ky
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne

Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 14:06
Wohnort: Trondheim
Kontaktdaten:

Re: [PS40] Mipmaplevel berechen

Beitrag von Jörg » 15.05.2009, 08:37

Fuer spezielle Geometrien kann man das im Pixelshader machen, aber fuer ein allgemeines Mesh, welches in unterschiedlichen Aufloesungen texturiert ist, geht das nicht ohne Zusatzinformationen pro Pixel.
Eine Naeherung kannst Du die herleiten, in dem du eine zu Kamera parallele Flaeche betrachtest und die Anzahl der Pixel anschaust, welche sie ueberstreicht. Der Miplevel ergibt sich dann proportional zum Logarithmus des Abstandes. Ueber die Normale kannst Du dann per cos()-Gesetz ermitteln, wie du die Mipstufe in Abhaengigkeit vom Sichtwinkel erhoehen musst.
Ich bezweifele, dass das aber gross hilft.
Daher die Frage: Welcher Art ist deine Optimierung ?

Benutzeravatar
Zudomon
Establishment
Beiträge: 2127
Registriert: 25.03.2009, 08:20
Kontaktdaten:

Re: [PS40] Mipmaplevel berechen

Beitrag von Zudomon » 15.05.2009, 08:39

@Krishty
Die Texturkoordinaten werden erst innerhalb des Pixelshaders berechnet. Und sie variieren zwischen den einzelnen If-Blöcken. Es ist also meiner Meinung nach unmöglich, auf eine Änderungsrate zurückzugreifen.

Kann ich nicht eine Annäherung anhand des Abstands und der Normale machen? Auch wenn das Ergebnis nicht perfekt würde, wäre es immer noch besser, als gar kein Mipmapping.

@Jörg
Doch, sowas in der Art habe ich mir gedacht. Die Frage ist nur, wie man das am besten umsetzt

Meine Optimierung ist ein Octree im Pixelshader.

Jörg
Establishment
Beiträge: 296
Registriert: 03.12.2005, 14:06
Wohnort: Trondheim
Kontaktdaten:

Re: [PS40] Mipmaplevel berechen

Beitrag von Jörg » 15.05.2009, 09:27

Auf die schnelle ohne Papier:
miplevel = constant * ln(distance) + 1/cos(normal * to_view_vector)
constant ergibt sich aus Textureaufloesung, Bildschirmaufloesung und einem Normalisierungsfaktor fuer log_base2.

Antworten