Perincian horizon air grid yang diproyeksikan

13

Saya mencoba menerapkan pemandangan laut dengan C ++ dan DirectX11. Saat ini saya memiliki grid yang diproyeksikan, gelombang Gerstner dan bayangan dasar. Masalah saya adalah ketika saya mengarahkan kamera secara horizontal, sehingga saya bisa melihat cakrawala air, di kejauhan, grid yang diproyeksikan menjadi tidak mencukupi, bahkan pada bilangan titik tinggi. Tangkapan layar ini menggambarkan masalah:

permukaan air yang diarsir

permukaan air wireframe

Saya tahu penyebab masalahnya adalah dalam konsep grid yang diproyeksikan (grid dirinci di dekat kamera, jauh dari itu), tetapi harus ada praktik terbaik untuk menyelesaikan ini.

Ada ide?

Gábor Szalóki
sumber

Jawaban:

7

Saya percaya solusi umum adalah dengan membagi transformasi kamera yang digunakan untuk memproyeksikan grid dari transformasi kamera yang digunakan untuk membuat grid. Pada perspektif yang dekat dengan top-down, kedua kamera bertepatan, tetapi ketika kamera penglihatan mendekati perspektif horizontal, kamera proyeksi menyimpang dan mencoba untuk menjaga kecenderungan minimum, yaitu melayang di suatu tempat di atas kamera pandangan dan sedikit melihat ke bawah.

Agak sulit adalah memastikan bahwa bidang pandang kamera proyeksi selalu mencakup wilayah pemandangan yang dilihat dari kamera render. Saya tidak memiliki sumber daya yang menjelaskan cara menghitung transformasi yang sesuai, dan mungkin membosankan untuk diturunkan dengan tangan.

Solusi lain adalah dengan mengambil kotak alat pemrosesan sinyal: Artefak yang terlihat pada gambar Anda pada dasarnya adalah aliasing, yang disebabkan oleh pengambilan sampel yang tidak memadai dari bidang ketinggian gelombang oleh kisi yang diproyeksikan. Oleh karena itu, salah satu solusinya adalah memfilter bidang ketinggian dengan tepat, tergantung pada area yang diproyeksikan sel kisi. Saya percaya ini digunakan dalam render offline lautan, dan pada dasarnya memastikan bahwa gelombang di cakrawala menjadi datar. Namun, saya tidak yakin seberapa layaknya ini dalam render waktu-nyata, karena Anda akan memerlukan penyaringan anisotropik berkualitas tinggi untuk membuat pendekatan ini terlihat masuk akal.

Benedikt Bitterli
sumber
Terima kasih atas sarannya, saya memilih solusi malas untuk saat ini. Saya menggunakan fungsi di vertex shader yang menentukan atenuasi gelombang dari jarak dari kamera.
Gábor Szalóki
6

Anda bisa realistis dan real-time. rahasianya adalah mengubah representasi setiap kali informasi masuk dalam skala Shannon-Nyquist (yaitu kisi): dari geometri ke peta normal ke model naungan. Makalah ini dibuat untuk Anda: http://maverick.inria.fr/Publications/2010/BNH10/index.php (lihat juga video Yoube)

Fabrice NEYRET
sumber
3

Beberapa perangkat lunak seperti Maya, pecahkan masalah ini dengan menggunakan kutub (atau sebenarnya kartesian yang mengubah kutub dari kejauhan) dengan cara yang sama seperti ketika Anda memusatkan pada posisi kamera. Pengaturan ini menambahkan lebih banyak detail di mana ia paling penting. Kemudian mereka mengandalkan pemrosesan normal shader pada rentang lebih lanjut. Ada ruang untuk offcourse improvisasi. Anda dapat sedikit memodifikasi pendekatan ini, dan memiliki bentuk lain yang meningkatkan kepadatan jala ke arah kamera. Manfaatnya adalah Anda dapat meregangkan efek hingga ke cakrawala tanpa khawatir dengan jahitannya.

Trik untuk tidak membuat displacentent tercampur dalam kasus ini adalah Anda secara bertahap mengurangi perpindahan saat Anda bergerak lebih jauh. Anda kemudian hanya menggunakan modifikasi normal dalam pixel shader saat Anda melangkah lebih jauh. Ini lebih mudah disaring daripada harus menyaring tepi shiluette yang akurat. Juga jika Anda dapat melihat sejauh itu maka vawes Anda mungkin cukup rata pula.

joojaa
sumber