2016-09-19 2 views
4

Von der OpenGL-Dokumentation:Unterschied zwischen dFdxFine und dFdxCoarse

dFdxFine und dFdyFine berechnen Derivate lokalen differenzier auf dem Wert von p für das aktuelle Fragment und seinem unmittelbaren Nachbarn (n) basiert auf der Verwendung.

dFdxCoarse und dFdyCoarse berechnen Ableitungen mit lokalem Vergleich basierend auf dem Wert von p für die Nachbarn des aktuellen Fragments und enthalten möglicherweise, aber nicht notwendigerweise, den Wert für das aktuelle Fragment. Das heißt, über einen bestimmten Bereich kann die Implementierung Ableitungen an weniger eindeutigen Orten berechnen, als für die entsprechenden Funktionen dFdxFine und dFdyFine zulässig wären.

Welcher ist der Unterschied zwischen ihnen? Wann sollte ich mich kümmern?

Ich verstehe, dass beide die Ableitung des Werts in Bezug auf die Fensterkoordinaten berechnet, aber ich verstehe nicht die Methode, um sie zu berechnen.

Ich denke, dass sie beide in Hardware implementiert sind, aber könnten Sie eine dFdx Pseudo-Code-Implementierung?

+0

"* Ich verstehe nicht die Methode, um sie zu berechnen. *" Der GLSL-Standard bietet eine tatsächliche Funktion. –

Antwort

5

Vom GLSL spec:

Es ist typisch ein 2x2 Quadrat von Fragmenten oder Proben, und berechnen unabhängig dFdxFine pro Reihe und unabhängig dFdyFine pro Spalte zu betrachten, während nur ein einziges Rechen dFdxCoarse und eine einzige dFdyCoarse für die gesamte 2x2 Quadrat.

Die Art und Weise, wie die Ableitungen berechnet werden, erfolgt grundsätzlich durch numerische Differenzierung. Der Einfachheit halber nehmen wir an, dass wir in einen Einzelabtast-Framebuffer rendern und annehmen, dass wir dFdx(a) berechnen wollen. Dann typischerweise ein 2x2 Quadrat von benachbarten Fragmenten gleichzeitig abgeschattet werden (das heißt innerhalb der gleichen Arbeitsgruppe):

a00 a10 
    a01 a11 

Konzeptionell alle Shader Invokationen ihren Wert berechnen a, schreiben sie in den gemeinsamen Speicher, und eine Barriere erteilen.

dFdxFine(a) = (a10 - a00)/dx  at xy = 00, 10 
dFdxFine(a) = (a11 - a01)/dx  at xy = 01, 11 

die Spezifikation ausdrücklich für die Grob Derivate erlaubt nur ein Derivat für den gesamten 2x2-Block von Pixeln zu berechnen: Dann, nachdem die Barriere kann die Derivate durch angenähert werden. So eine konforme Implementierung könnte genauso gut berechnen:

dFdxCoarse(a) = (a10 - a00)/dx  at xy = 00, 10, 01, 11 

Ob es einen Unterschied in der Leistung zwischen den beiden auf der Hardware abhängt. Wenn sie jedoch unterschiedliche Ergebnisse auf Ihrer Hardware liefern, sollte die 'grobe' Version schneller sein. Normalerweise sollten Sie diese Funktionen jedoch nicht beachten. Verwenden Sie einfach die Varianten dFdx und dFdy, die die Implementierungsstandardvariante (fein oder grob) verwenden.

+0

Ich würde vorschlagen, 'Fine' zu ​​verwenden, es sei denn, es gibt ein echtes Leistungsproblem, dann wechseln Sie zu' Coarse' als Mikro-Optimierung. –

+0

Das macht Sinn, aber ...Nach dem Lesen der GLSL-Spezifikation fand ich folgendes: "Somit können alle Grobabkömmlinge zweiter Ordnung, z. B. dFdxCoarse (dFdxCoarse (x)) auch für nicht-lineare Argumente 0 sein. Fine-Derivate zweiter Ordnung, zB wird dFdxFine (dFdxFine (x)) den Unterschied zwischen den unabhängigen feinen Derivaten, die innerhalb des 2x2-Quadrats berechnet werden, korrekt wiedergeben. " In Ihrem Beispiel ist dFdxFine (dFdxFine (x)) jedoch immer 0, richtig? – dv1729

+2

@ dv1729: "* dFdxFine (dFdxFine (x)) *" Sie haben die Spezifikation falsch gelesen. Die innere Funktion ist dFd *** y *** Fein. –