Projiziertes Gitterwasserhorizontdetail

13

Ich versuche, eine Ozeanszene mit C ++ und DirectX11 zu implementieren. Derzeit habe ich ein projiziertes Raster, Gerstner-Wellen und eine Grundschattierung. Mein Problem ist, dass wenn ich meine Kamera horizontal ausrichte, so dass ich den Wasserhorizont in der Ferne sehen kann, das projizierte Gitter selbst bei hohen Scheitelpunktzahlen unzureichend wird. Diese Screenshots veranschaulichen das Problem:

schattige Wasseroberfläche

Drahtmodell Wasseroberfläche

Ich weiß, dass die Ursache des Problems im Konzept des projizierten Gitters liegt (das Gitter ist in der Nähe der Kamera detailliert, weit davon entfernt), aber es muss eine bewährte Methode geben, um dies zu lösen.

Irgendwelche Ideen?

Gábor Szalóki
quelle

Antworten:

7

Ich glaube, eine gängige Lösung besteht darin, die zum Projizieren des Rasters verwendete Kameratransformation von der zum Rendern des Rasters verwendeten Kameratransformation zu trennen. Bei Perspektiven in der Nähe von oben nach unten stimmen die beiden Kameras überein, aber wenn sich die Betrachtungskamera einer horizontalen Perspektive nähert, weicht die Projektionskamera ab und versucht, eine minimale Neigung beizubehalten, dh sie schwebt irgendwo über der Betrachtungskamera und schaut leicht nach unten.

Das Knifflige dabei ist, sicherzustellen, dass das Sichtfeld der Projektionskamera immer den Bereich der Szene abdeckt, der von der Renderkamera aus gesehen wird. Ich habe keine Ressource zur Hand, die ausführlich beschreibt, wie die entsprechenden Transformationen berechnet werden, und es ist möglicherweise mühsam, sie von Hand abzuleiten.

Eine andere Lösung besteht darin, die Toolbox für die Signalverarbeitung zu nutzen: Die in Ihrem Bild sichtbaren Artefakte sind im Wesentlichen Aliasing-Effekte, die auf eine unzureichende Abtastung des Wellenhöhenfelds durch das projizierte Gitter zurückzuführen sind. Daher besteht eine Lösung darin, das Höhenfeld in Abhängigkeit von der projizierten Fläche einer Gitterzelle angemessen zu filtern. Ich glaube, dies wird beim Offline-Rendern von Ozeanen verwendet und stellt im Wesentlichen sicher, dass die Wellen am Horizont flach werden. Ich bin mir jedoch nicht sicher, wie realisierbar dies beim Rendern in Echtzeit ist, da Sie eine hochwertige anisotrope Filterung benötigen würden, damit dieser Ansatz vernünftig aussieht.

Benedikt Bitterli
quelle
Vielen Dank für den Rat, ich entschied mich für die faulen Lösung für jetzt. Ich benutze eine Funktion im Vertex-Shader, die die Wellenabschwächung aus der Entfernung von der Kamera bestimmt.
Gábor Szalóki
6

Sie können sowohl realistisch als auch in Echtzeit sein. Das Geheimnis ist, die Darstellung jedes Mal zu ändern, wenn die Informationen unter die Shannon-Nyquist-Skala (dh das Raster) fallen: von der Geometrie über normale Karten bis hin zu Schattierungsmodellen. Dieses Papier ist für Sie gemacht: http://maverick.inria.fr/Publications/2010/BNH10/index.php (siehe auch Yoube Videos)

Fabrice NEYRET
quelle
3

Einige Programme wie Maya lösen dieses Problem, indem Sie einen Polarkartesiker (oder einen Kartesiker, der sich in der Ferne polarisiert) verwenden. Dieses Setup fügt mehr Details hinzu, wo es am meisten zählt. Dann verlassen sie sich auf die normale Verarbeitung des Shaders in weiteren Bereichen. Es gibt Raum für Verbesserungen im Offcourse. Sie ändern diesen Ansatz ein wenig und haben jede andere Form, die die Maschendichte in Richtung der Kamera erhöht. Dies hat den Vorteil, dass Sie den Effekt bis zum Horizont ausdehnen können, ohne sich um die Naht kümmern zu müssen.

Der Trick, den Verschiebenden in diesem Fall nicht durcheinander zu bringen, besteht darin, dass Sie die Verschiebung allmählich verringern, wenn Sie sich weiter wegbewegen. Sie verwenden dann einfach die normale Modifikation im Pixel-Shader, wenn Sie weiter kommen. Dies ist einfacher zu filtern als eine genaue Shiluette-Kante zu filtern. Auch wenn Sie so weit weg sehen können, sind Ihre Augen wahrscheinlich ohnehin flach genug.

joojaa
quelle