Sebelum saya sampai ke pertanyaan saya, saya tahu solusi yang paling jelas adalah dengan menggunakan tampilan port rect dinormalisasi, namun saya membutuhkan bentuk yang lebih kompleks daripada persegi panjang, dan saya sudah mencari menggunakan port tampilan rect dan sepertinya tidak menjadi solusi saya.
EDIT: Beberapa orang bingung dengan pertanyaan saya, biarkan saya masuk ke sedikit lebih detail. Apa yang terjadi adalah ketika pemain bergerak ke satu portal, saya membuat kontroler FPS klon dan memindahkannya dari yang lain. Ini memberi saya dua kamera, dan tampilan yang Anda lihat di kanan atas. Itu hanya menunjukkan satu kamera, dan memotong melalui portal. Yang saya inginkan adalah sesuatu yang mirip dengan inidi mana kamera berbaur untuk menciptakan ilusi transisi yang mulus. Yang ingin saya lakukan adalah menghapus semuanya dari gambar pemeriksa hijau ke kiri pada gambar di bawah, dan menggantinya dengan kamera lain. Dengan begitu Anda mendapatkan bagian dari tampilan kamera A yang memuncak dari portal, dicampur dengan bagian dari tampilan kamera B yang memuncak dari portal lain, untuk mendapatkan satu gambar lengkap. Dan saat Anda bergerak melalui portal, perubahannya tepat.
Saya telah merancang sistem portal, saya memiliki segalanya, termasuk membuat pemain bergerak dengan lancar melalui portal. Masalah utama saya sekarang adalah mendapatkan bahwa efek perpaduan kamera tidak. Saya perlu dua kamera untuk berbaur bersama dengan mulus, seolah-olah Anda menjulurkan kepala melalui portal. Dan itu tidak bisa hanya persegi panjang, itu harus cocok namun pemain melihat melalui portal.
Petunjuk terbaik saya saat ini adalah memproyeksikan shader topeng kedalaman di belakang masing-masing portal, kemudian membuat kamera dari portal yang Anda tempuh hanya menjadi kedalaman saja. Lalu entah bagaimana mencampur dua kamera. Masalah utama saya adalah mencari tahu persis bagaimana saya akan melakukan ini, bagaimana membuat kamera kedua hanya membuat apa yang di luar portal, dan memiliki sisanya default untuk kamera 1 untuk mendapatkan satu proyeksi layar penuh.
Jika Anda bisa memberi saya ide, atau menjelaskan bagaimana saya bisa melakukan ini dengan shader topeng mendalam yang akan sangat membantu. Saya akan terus bekerja pada ini dan memperbarui saat saya membuat terobosan.
Jawaban:
Memahami Masalahnya
Dari apa yang saya lihat masalah yang Anda gambarkan adalah hasil dari pesawat dekat kamera yang memotong bidang yang ditentukan oleh portal. Sementara persimpangan ini terjadi, Anda dapat melihat di balik dinding portal aktif.
Ini mirip dengan masalah yang dialami dalam permainan lain ketika pemain hanya bertransisi dari atas air ke bawah air. Jika kamera tepat di atas air, tidak ada efek pemrosesan pasca diterapkan untuk mengaburkan tampilan pemain (membuatnya gelap dan buram dan biru). Jadi jika bagian bawah pesawat dekat tepat di bawah air pemain dapat melihat dengan jelas di bawah air.
Jika saya benar, Anda dapat mengonfirmasinya dengan mengubah posisi bidang ini saat menentukan matriks proyeksi. Saat jarak dari kamera ke pesawat dekat bertambah, begitu juga masalahnya.
Solusi Mudah
Membuat pesawat dekat sangat dekat dengan kamera harus hampir menghilangkan masalah ini. Solusi ini tidak lengkap, tetapi akan menghasilkan hasil yang cukup baik di sebagian besar kasus dan efisien.
Solusi Lengkap
Jika hanya menempatkan pesawat dekat ke kamera tidak memuaskan, maka Anda dapat membuat "topeng" untuk memadukan gambar yang dihasilkan dengan menampilkan adegan dari perspektif pemain dan portal.
Dengan asumsi Anda hanya mengizinkan portal untuk diterapkan pada permukaan datar, Anda dapat menghitung garis persimpangan antara bidang dekat kamera dan bidang yang ditentukan oleh portal (atau dinding tempat portal itu berada). Baris ini akan membagi layar menjadi dua bagian. Menentukan sisi mana garis dari piksel layar yang aktif akan memberi tahu Anda gambar render mana yang akan digunakan, gambar portal atau gambar kamera pemutar.
Perlu diingat bahwa jika masalah ini terjadi maka frustum tampilan kamera harus sepenuhnya berada di dalam portal sehingga garis persimpangan akan selalu terpotong sepenuhnya dari satu tepi layar ke tepi lainnya.
Tautan ini akan membantu matematika untuk menemukan garis. Kode di bawah ini seharusnya kurang lebih benar.
Garis persimpangan didefinisikan menggunakan titik pada garis dan arah garis. Di bawah arah persimpangan dihitung menggunakan produk silang dari portal normal dan arah tampilan kamera (mendekati bidang normal). Titik pada garis diberikan dengan melemparkan sinar dari titik di dekat pesawat langsung menuju bidang portal (sepanjang portal normal) dan menemukan titik persimpangan.
Pastikan viewDir adalah vektor satuan. portalVert1, 2 dan 3 hanyalah 3 dari 4 simpul yang digunakan untuk decal portal atau permukaannya. Ada cara lain untuk mendefinisikan bidang di mana portal terletak, tetapi saya menganggap ini adalah informasi yang paling mudah tersedia.
Setelah Anda memiliki dua vektor ini untuk menentukan garis persimpangan, kalikan masing-masing dengan tampilan dan kemudian matriks proyeksi untuk mendapatkannya di ruang layar.
Anda kemudian dapat menggunakan shader proses pos untuk memadukan gambar-gambar ini. Anda memilih gambar mana yang akan digunakan pada setiap piksel dengan menentukan sisi mana dari garis pemisah tempat piksel saat ini berada. Ini dilakukan dengan mengambil posisi piksel (yang juga merupakan posisi yang Anda gunakan untuk mencari target render texel) dan melakukan;
Sisi diberikan oleh apakah d lebih atau kurang dari 0. Jika itu tepat 0, maka Anda berada di telepon.
Untuk referensi tentang matematika di atas lihat ini .
Metode ini juga dapat digunakan saat membuat buffer mask / stensil kedalaman untuk digunakan sebelum rendering dari perspektif portal. Anda dapat membuat quad layar penuh dan menggunakan garis untuk mengirisnya.
sumber
Jawaban yang disarankan sangat bagus, tetapi akhirnya saya pergi untuk teknik yang berbeda menggunakan topeng kedalaman.
Apa yang Anda lakukan adalah mengambil skrip dan shader INI , Anda menempatkan skrip pada setiap objek dengan renderer di adegan Anda dan mengatur antrian render ke 3020 (saya akan memposting skrip untuk mempermudah ini nanti).
Kemudian, Anda membuat sebuah kotak pesawat (semua menghadap ke dalam, dalam gambar Anda tidak dapat melihat sisi kotak yang paling dekat dengan Anda, tetapi ketika Anda berada di dalam kotak, Anda akan melihat semua berwarna abu-abu) di belakang KEDUA portal Anda seperti itu: Dan atur mereka ke lapisan khusus mereka sendiri (saya memilih "DepthMask" untuk tambang), lalu Anda menambahkan bahan dengan shader di atasnya.
Anda kemudian mengambil kamera utama dan hapus centang pada layer khusus Anda dari culling mask (saya hapus centang pada layer DepthMask) dan atur kedalamannya ke 0.
Kemudian ketika Anda melakukan teleportasi dan mengkloning kamera, atur bendera jernih kamera lainnya ke "Hanya Kedalaman" dan kedalamannya menjadi 1.
Anda kemudian mendapatkan layar mulus yang dipadukan antara dua tampilan kamera.
sumber