ich versuche mich gerade an einer Echtzeitimplementierung des folgenden Papers:
http://publik.tuwien.ac.at/files/PubDat_182027.pdf
Ziemlich weit unten im Paper exsitiert noch eine Präsentation, welche folgende Rendermanimplementierung beinhaltet:
Code: Alles auswählen
IF(H.V>0.0)
{
specColor += CI*torranceSparrowReflector(Nf,V,Ln,H,eta,kappa,beta);
[b]1[/b] vector refractLn = refract(Ln,-H, eta_avg);
[b]1[/b] vector refractV = refract(-V,-H,1.0/eta_avg);
color a = absorption(Nf,refractV,refractLn,alpha,d);
float t = tir(Nf,refractV,refractLn,H,eta_avg);
[b]2[/b] fresnel(V,H,1/eta_avg,fr,ft);
envColor = envColor + (env*fr);
[b]3[/b] diff += ft*a*t*CI*torranceSparrowReflector(Nf,V,Ln,H,eta_base,kappa_base,beta_base);
}
Ich habe zu den drei makierten Punkten einige Fragen:
1.) Die Berechnung der Refractionsvektoren
1.1) Warum wird H verwendet und nicht N
1.2) Warum wird -H verwendet und nicht H
1.3) Ich würde mir die Berechnung im shader in HLSL so vorstellen:
Code: Alles auswählen
refractLn = refract(-Ln,N,eta_avg); //Ln zeigt von der Fläche weg
3.) Das ist der wichtigste Punkt: Ich verstehe nicht warum hier die BRDF mit Ln und V gesampelt wird. Dem ganzen Paper zufolge würde ich vermuten, dass man hier refractLn bzw. refractV verwenden sollte (bzw. die mit -1 multiplizierten Richtungen.
Ich habe schon alle möglichen Kombinationen ausprobiert aber leider sieht das Ergebnis nie wirklich realistisch aus. Vielleicht hat ja jemand eine Idee was ich falsch gemacht habe.
Danke,
Manuel