Augenparallaxenbrechung

7

Ich versuche, den von Jorge Jimenez in dieser Präsentation erläuterten Parallax Refraction-Effekt zu implementieren : http://www.iryoku.com/downloads/Next-Generation-Character-Rendering-v6.pptx und habe einige Schwierigkeiten. Hier ist ein Screenshot des interessanten Teils.

Bildschirm

In diesem Dokument fehlen jedoch einige Erklärungen, insbesondere im zweiten Teil der physikalisch basierten Refraktion .

Folgendes habe ich im Moment erreicht.
Dies ist der einfache Parallax Refraction- Effekt. Wie Sie im Screenshot sehen können, tritt bei Streifwinkeln in der Iris ein kleiner Fehler auf, wenn der Parallax Scale-Wert zu hoch ist.

Dies wird durch die Parallaxenberechnung verursacht. Gibt es jedoch einige Tricks, um solche Probleme zu vermeiden oder zu minimieren?

Ich möchte im Moment nicht tiefer in die Parallaxenzuordnung einsteigen, daher möchte ich keine steile Parallaxenzuordnung oder Parallaxenokklusionszuordnung verwenden.

Auge

Hier ist der Code. Nichts wirklich Besonderes.

// height value comes from a texture
float2 offset = height * viewDir;
offset.y = -offset.y;
texcoord -= ParallaxScale * offset;
// Next there is the texture sampling with the texcoord value

Ich habe auch eine andere Frage nach dem Physikalisch basierten Refraktion Teil , das ist wirklich nicht gut erklärt und ich fehle , wie einige Werte berechnet werden , wie refractedW, frontNormalWoder heightW. Wenn jemand einige Erklärungen zu diesen Werten geben könnte.

Vielen Dank.

Matte
quelle

Antworten:

0

Hier ist die Art und Weise, wie ich den Brechungsvektor nach dem Snellschen Gesetz berechne.

float cosine = dot(viewDir, worldNormal);
float sine = sqrt(1 - cosine * cosine);

float sine2 = (_IOR * sine);
float cosine2 = sqrt(1 - sine2 * sine2);

float3 x = -worldNormal;
float3 y = normalize(cross(cross(viewDir, worldNormal), worldNormal));
float3 refractedW = x * cosine2 + y * sine2;

Dies ist in die physikalisch basierte Brechung integriert und liefert interessante Ergebnisse, aber ich weiß immer noch nicht, wie ich das Problem der hohen Parallaxenskala, das bei Streifwinkeln auftritt, beseitigen kann ...

Irgendeine Idee, wie man das in den Griff bekommt?

Matte
quelle
Es könnte auch einige Möglichkeiten geben, die Gesetzesberechnungen des Snell zu optimieren. Ratschläge dazu sind ebenfalls willkommen.
MaT
0

Während ich mit Unity arbeite, habe ich eine interessante Methode gefunden, um den Parallaxenversatz im Motor zu berechnen. Es ist nicht physikalisch basiert, liefert aber bessere Ergebnisse als die klassische Parallaxenbrechung.

float2 ParallaxOffset(half h, half height, half3 viewDir)
{
    h = h * height - height / 2.0;
    float3 v = normalize(viewDir);
    v.z += 0.42;
    return h * (v.xy / v.z);
}
Matte
quelle