physikalisch basierte Schattierung, wie kombiniert man spiegelnde und diffuse Teile?


8

Nachdem ich eine Weile 'Standard'-Phong & Blinn-Shader geschrieben hatte, fing ich kürzlich an, mich mit physikalisch basierten Schattierungen zu beschäftigen. Eine Ressource, die mir sehr geholfen hat, sind diese Kursnotizen , insbesondere dieses Papier - es erklärt, wie man Blinn physikalisch plausibler macht.

Ich habe das in der Zeitung vorgeschlagene Blinn-Modell implementiert, und ich mag es wirklich, wie es aussieht. Die wichtigste vorgeschlagene Änderung (imo) ist die Einbeziehung des Fresnel-Reflexionsvermögens, und dies ist auch der Teil, der mir Probleme bereitet. Leider hat sich der Autor entschieden, sich nur auf den Spiegelteil zu konzentrieren und das diffuse Reflexionsvermögen wegzulassen. Angesichts einer diffusen Lambertschen Reflexion weiß ich einfach nicht, wie ich sie mit dem "verbesserten" Blinn kombinieren soll - denn nur das Hinzufügen diffuser und spiegelnder Teile scheint nicht mehr richtig zu sein.

Bei einigen Shadern wurde ein Gleitkomma-Fresnel-Term im Bereich von 0 bis 1 verwendet, der auf den Brechungsindizes der teilnehmenden Medien basiert. Schlicks Näherung wird jedes Mal verwendet:

float schlick( in vec3 v0, in vec3 v1, in float n1, in float n2 )
{
    float f0 = ( n1 - n2 ) / ( n1 + n2 );
    f0 *= f0;   
    return f0 + ( 1 - f0 ) * pow( dot( v0, v1 ), 5 );
} 

Auf diese Weise kann man dann linear zwischen diffusem und spiegelndem Beitrag interpolieren, basierend auf dem Fresnel-Term, z

float fresnel = schlick( L, H, 1.0002926 /*air*/, 1.5191 /*other material*/ );
vec3 color = mix( diffuseContrib, specularContrib, fresnel );

In der Arbeit stellt der Autor fest, dass dieser Ansatz falsch ist - weil er die Spiegelfarbe grundsätzlich nur dann abdunkelt, wenn L parallel oder nahezu parallel zu H ist - und dass Sie anstelle eines f0 basierend auf den Brechungsindizes das Spiegelbild behandeln sollten färben Sie sich als f0 und lassen Sie Ihre Schlick-Näherung ein vec3 wie folgt berechnen:

vec3 schlick( in vec3 v0, in vec3 v1, in vec3 spec )
{
    return spec + ( vec3( 1.0 ) - spec ) * pow( dot( v0, v1 ), 5 );
}

Dies führt dazu, dass die Spiegelfarbe unter Blickwinkeln in Richtung Weiß wechselt.

Nun ist meine Frage, wie würde ich eine diffuse Komponente in diese einführen? Bei 90 ° ist der Spiegelbeitrag vollständig weiß, was bedeutet, dass das gesamte einfallende Licht reflektiert wird, sodass kein diffuser Beitrag erfolgen kann. Kann ich bei Einfallswinkeln <90 ° einfach den gesamten diffusen Teil mit (vec3 (1) - schlick) multiplizieren, dh dem Anteil des Lichts, der nicht reflektiert wird?

vec3 diffuseContrib = max( dot( N, L ), 0.0 ) * kDiffuse * ( vec3( 1.0 ) - schlick( L, H, kSpec ) );

Oder brauche ich einen ganz anderen Ansatz?


2
Hast du das jemals gelöst? Ich habe gerade genau dieses Problem.

1
Ich hätte auch gerne eine Antwort darauf. Lagarde hat auch eine ähnliche Subtraktion der Spiegelfarbe vorgeschlagen (die er schließlich "nicht verwendet" hat), aber dies alles scheint sehr willkürlich.
v.oddou

Antworten:


1

Die kurze Antwort:

Sieht es gut genug aus

  • Ja - behalte es.

  • Nein - spielen Sie noch ein bisschen damit herum.

Lange Antwort:

Um eine genaue realistische physikalisch basierte Schattierung zu erhalten, ist mehr GPU-Leistung erforderlich als möglich. Sie müssen immer auf Fälschungen zurückgreifen, weil ein Computer nicht das gesamte Universum simulieren kann, nicht einmal das gesamte sichtbare Lichtspektrum.

Es ist das "unheimliche Tal" der Schattierung.

Nicht nur aufgrund von Umgebungslicht und Okklusion, sondern zum Beispiel in Außenumgebungen haben sowohl Tages- als auch Mondlicht eine große Menge an UV-Spektrum-Licht, von dem ein winziger Teil durch verschiedene Materialien, meist organische, in das sichtbare Spektrum zurückversetzt wird. Verschiedene Arten von Leuchtstoffröhrenbeleuchtung und HID emittieren auch eine gute Menge UV-Licht.

Der Effekt ist subtil, aber dank jahrelanger Evolution verarbeitet das Gehirn ihn instinktiv, da dies den Unterschied zwischen einer guten Mahlzeit und möglicherweise einem langen qualvollen Tod bedeutet. Wenn also etwas ganz leicht von unserem Gehirn abweicht, ertönt der Alarm "Etwas stimmt nicht" .

Cartoony, unrealistische und fast realistische, aber absichtlich um einiges (z. B. Halo) Kunststile vermeiden dieses Problem.

Ein weiteres Problem ist, dass keine zwei Menschen die gleiche RYGBL-Rezeptorpräsenz oder Antwortkurve haben, während Monitore ausschließlich RGB sind und daher nicht für alle Menschen Bilder perfekt reproduzieren können. (Rot, Gelb, Grün, Blau und Luma, siehe Tetrachromacy - http://en.wikipedia.org/wiki/Tetrachromacy )

Egal wie hart Sie arbeiten, es wird "etwas falsch" sein und Raum für Verbesserungen, zumindest für jemanden irgendwo.

Und dies ist ein Grund, warum es so viele Schattierungsmodelle gibt.

Aus diesem Grund betrügt ein guter Künstler immer die Lichtverhältnisse und die Lichtreaktion in Umgebungen bis zu einem gewissen Grad, um ein "gut genug" Ergebnis zu erzielen (es ist nie perfekt). Geben Sie ihm einfach Zugang zu den Einstellungen und betrügen Sie sich auf ihre Weise zu erfreulichen Ergebnissen.


In diesem Bereich gibt es zu viel Forschung, um eine solche Nichtantwort zu geben.
Tara

@Tara, willkommen bei Stack Exchange. Ich bin mir sicher, dass Sie sich bei all der "zu großen Forschung in diesem Bereich" die Zeit nehmen werden, eine richtige Nicht-Nicht-Antwort zu schreiben und zur Community beizutragen, anstatt nur einen einzeiligen Kommentar. Auf dieser Seite befindet sich eine kleine Schaltfläche mit der Aufschrift "Weitere Antwort hinzufügen", wenn Sie sie finden können. Könnte ein bisschen Forschung brauchen, um es zu finden, aber es ist da.
Stephane Hockenhull

Wow, wie passiv-aggressiv. Ich habe nicht gesagt, dass ich es besser weiß. Ich sagte, ich weiß, dass es eine Reihe von Forschungen gibt, die versuchen, dieses Problem anzugehen, indem sie nicht einfach "einfach alles tun" und sich mit dem menschlichen Gehirn und dem Tod befassen.
Tara

Ich sehe immer noch keine neue Antwort außer der "Nicht-Antwort" von 2014 und dem einzeiligen, nicht konstruktiven, aktiv-aggressiven Kommentar, der 5 Jahre später veröffentlicht wurde. Sie sind zu 100% willkommen, all die Recherchen (von denen Sie bisher keine Links bereitgestellt haben, nur den einzeiligen Kommentar), die perfekt auf Echtzeit-Game-Engines anwendbar sind, zu nehmen und sich die Zeit zu nehmen, um sie in einer richtigen Antwort zusammenzufassen.
Stephane Hockenhull

Es geht mir gut, danke. Ich habe die Frage bereits abgelehnt und meinen ersten Kommentar hinzugefügt, um zu erklären, warum ich das getan habe, weil die Leute ungeklärte Abstimmungen nicht mögen.
Tara
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.