Détail de l'horizon de l'eau de la grille projetée

13

J'essaie d'implémenter une scène océanique avec C ++ et DirectX11. Actuellement, j'ai une grille projetée, des ondes de Gerstner et un ombrage de base. Mon problème est que lorsque je vise mon appareil photo horizontalement, afin que je puisse voir l'horizon de l'eau, au loin, la grille projetée devient insuffisante, même à des sommets élevés. Ces captures d'écran illustrent le problème:

surface d'eau ombragée

surface de l'eau filaire

Je sais que la cause du problème réside dans le concept de la grille projetée (la grille est détaillée près de la caméra, loin de là), mais il doit y avoir une meilleure pratique pour résoudre ce problème.

Des idées?

Gábor Szalóki
la source

Réponses:

7

Je crois qu'une solution courante consiste à diviser la transformation de caméra utilisée pour projeter la grille de la transformation de caméra utilisée pour rendre la grille. Dans des perspectives proches de haut en bas, les deux caméras coïncident, mais lorsque la caméra de visualisation se rapproche d'une perspective horizontale, la caméra de projection dévie et essaie de garder une inclinaison minimale, c'est-à-dire qu'elle plane quelque part au-dessus de la caméra de vision et regarde légèrement vers le bas.

L'astuce consiste à s'assurer que le champ de vision de la caméra de projection couvre toujours la région de la scène vue depuis la caméra de rendu. Je n'ai pas de ressource à portée de main qui détaille comment calculer les transformations appropriées, et il pourrait être fastidieux de dériver à la main.

Une autre solution consiste à saisir la boîte à outils de traitement du signal: les artefacts vus dans votre image sont essentiellement des alias, causés par un échantillonnage insuffisant du champ de hauteur des vagues par la grille projetée. Par conséquent, une solution consiste à filtrer le champ de hauteur de manière appropriée, en fonction de la zone projetée d'une cellule de grille. Je crois que cela est utilisé dans le rendu hors ligne des océans, et il garantit essentiellement que les vagues à l'horizon vont à plat. Cependant, je ne sais pas dans quelle mesure cela est possible dans le rendu en temps réel, car vous auriez besoin d'un filtrage anisotrope de haute qualité pour que cette approche semble raisonnable.

Benedikt Bitterli
la source
Merci pour les conseils, j'ai choisi la solution paresseuse pour l'instant. J'utilise une fonction dans le vertex shader qui détermine l'atténuation des ondes à partir de la distance de la caméra.
Gábor Szalóki
6

Vous pouvez être à la fois réaliste et en temps réel. le secret est de changer de représentation chaque fois que l'information passe sous l'échelle de Shannon-Nyquist (c'est-à-dire la grille): de la géométrie aux cartes normales aux modèles d'ombrage. Ce papier est fait pour vous: http://maverick.inria.fr/Publications/2010/BNH10/index.php (voir aussi les vidéos Yoube)

Fabrice NEYRET
la source
3

Certains logiciels comme Maya résolvent ce problème en utilisant un polaire (ou en fait cartésien qui devient polaire à distance) de la même manière que votre grille est centrée sur la position de la caméra. Cette configuration ajoute plus de détails là où elle compte le plus. Ensuite, ils s'appuient sur le traitement normal des shaders à d'autres plages. Il y a de la place pour un cours de perfectionnement. Vous modifiez à froid cette approche un peu et avez toute autre forme qui augmente la densité du maillage vers la caméra. L'avantage est que vous pouvez étirer l'effet jusqu'à l'horizon sans vous soucier de la couture.

L'astuce pour ne pas embrouiller le déplacé dans ce cas est que vous réduisez progressivement le déplacement à mesure que vous vous éloignez. Vous utilisez ensuite simplement la modification normale dans le pixel shader à mesure que vous avancez. Ceci est plus facile à filtrer que d'avoir à filtrer un bord de shiluette précis. De plus, si vous pouvez voir aussi loin, vos vawes sont probablement suffisamment plats de toute façon.

joojaa
la source