Bagikan melalui


Stabilisasi hologram — MRTK2

Performa

Agar platform dan perangkat realitas campuran yang mendasar menghasilkan hasil terbaik, penting untuk mencapai kecepatan bingkai yang berkinerja. Framerate target (misalnya: 60 FPS atau 90 FPS) akan bervariasi di seluruh platform dan perangkat. Namun, framerate rapat aplikasi realitas campuran akan memiliki hologram yang stabil serta pelacakan kepala yang efisien, pelacakan tangan, dan banyak lagi.

Pelacakan lingkungan

Penyajian holografik yang stabil sangat bergantung pada pelacakan head-pose oleh platform &perangkat. Unity akan merender adegan setiap bingkai dari pose kamera yang diperkirakan dan disediakan oleh platform yang mendasar. Jika pelacakan ini tidak mengikuti gerakan kepala yang sebenarnya dengan benar, maka hologram akan muncul secara visual tidak akurat. Ini sangat jelas dan penting untuk perangkat AR seperti HoloLens di mana pengguna dapat menghubungkan hologram virtual dengan dunia nyata. Performa signifikan untuk pelacakan kepala yang andal, tetapi mungkin ada fitur penting lainnya juga. Jenis elemen lingkungan yang memengaruhi pengalaman pengguna akan bergantung pada spesifikasi platform yang ditargetkan.

Realitas Campuran Windows

Platform Windows Mixed Reality menyediakan beberapa bahan referensi untuk menstabilkan hologram pada platform. Ada beberapa alat utama meskipun pengembang dapat memanfaatkan untuk meningkatkan pengalaman visual hologram bagi pengguna.

Berbagi buffer kedalaman

Pengembang Unity memiliki opsi untuk berbagi buffer kedalaman aplikasi dengan platform. Ini memberikan informasi, di mana hologram ada untuk bingkai saat ini, yang dapat digunakan platform untuk menstabilkan hologram melalui proses yang dibantu perangkat keras yang dikenal sebagai Proyeksi Ulang Tahap Akhir.

Proyeksi ulang tahap akhir

Pada akhir penyajian bingkai, platform Windows Mixed Reality mengambil target render warna & kedalaman yang dihasilkan oleh aplikasi dan mengubah output layar akhir untuk memperhitungkan sedikit pergerakan kepala sejak prediksi pose kepala terakhir. Perulangan permainan aplikasi membutuhkan waktu untuk dijalankan. Misalnya, pada 60 FPS, ini berarti aplikasi mengambil ~16,667ms untuk merender bingkai. Meskipun ini mungkin tampak seperti jumlah waktu miniscule, posisi pengguna dan orientasi kepala mereka akan berubah menghasilkan matriks proyeksi baru untuk kamera dalam penyajian. Proyeksi ulang tahap akhir mengubah piksel dalam gambar akhir untuk memperhitungkan perspektif baru ini.

LSR bidang per piksel vs stabilisasi

Bergantung pada titik akhir perangkat dan versi OS yang berjalan pada perangkat Windows Mixed Reality, algoritma Reprojeksi Tahap Akhir akan dilakukan per piksel atau melalui bidang stabilisasi.

Berbasis kedalaman per piksel

Proyeksi ulang berbasis kedalaman per piksel melibatkan pemanfaatan buffer kedalaman untuk memodifikasi output gambar per piksel dan dengan demikian menstabilkan hologram pada berbagai jarak. Misalnya, bola 1m jauhnya mungkin berada di depan pilar yang berjarak 10m jauhnya. Piksel yang mewakili bola akan memiliki transformasi yang berbeda dari piksel yang jauh mewakili pilar jika pengguna telah memiringkan kepala mereka sedikit. Proyeksi ulang per piksel akan memperhitungkan perbedaan jarak ini di setiap piksel untuk proyeksi ulang yang lebih akurat.

Bidang stabilisasi

Jika tidak memungkinkan untuk membuat buffer kedalaman yang akurat untuk dibagikan dengan platform, bentuk lain dari LSR menggunakan bidang stabilisasi. Semua hologram dalam adegan akan menerima beberapa stabilisasi, tetapi hologram yang terbaring di bidang yang diinginkan akan menerima stabilisasi perangkat keras maksimum. Titik dan normal untuk bidang dapat disediakan ke platform melalui HolographicSettings.SetFocusPointForFrame API yang disediakan oleh Unity.

Format buffer kedalaman

Jika menargetkan HoloLens untuk pengembangan, sangat disarankan untuk menggunakan format buffer kedalaman 16-bit dibandingkan dengan 24-bit. Ini dapat menghemat sangat pada performa meskipun nilai kedalaman akan memiliki lebih sedikit presisi. Untuk mengimbangi presisi yang lebih rendah dan menghindari z-fighting, disarankan untuk mengurangi bidang klip jauh dari nilai default 1000m yang ditetapkan oleh Unity.

Catatan

Jika menggunakan format kedalaman 16-bit, efek buffer stensil yang diperlukan tidak akan berfungsi karena Unity tidak membuat buffer stensil dalam pengaturan ini. Memilih format kedalaman 24-bit secara sebaliknya akan membuat buffer stensil 8-bit, jika berlaku pada platform grafis titik akhir.

Berbagi buffer kedalaman di Unity

Untuk memanfaatkan LSR berbasis kedalaman, ada dua langkah penting yang perlu dilakukan pengembang.

  1. Di bawah Edit>Pengaturan>Proyek Pemutar>Pengaturan>XR SDK> Realitas Virtual Aktifkan Berbagi Buffer Kedalaman
    1. Jika menargetkan HoloLens, disarankan untuk memilih format kedalaman 16-bit juga.
  2. Saat merender warna di layar, render kedalaman juga

Opaque GameObjects di Unity umumnya akan menulis ke kedalaman secara otomatis. Namun, objek transparan & teks umumnya tidak akan menulis ke kedalaman secara default. Jika menggunakan MRTK Standard Shader atau Text Mesh Pro, ini dapat dengan mudah diperbaiki.

Catatan

Untuk dengan cepat menentukan objek mana dalam adegan yang tidak menulis ke buffer kedalaman secara visual, seseorang dapat menggunakan utilitas Buffer Kedalaman Render di bawah Pengaturan Editor di profil Konfigurasi MRTK.

Shader Standar MRTK Transparan

Untuk bahan transparan menggunakan shader MRTK Standard, pilih bahan untuk melihatnya di jendela Inspektur . Kemudian klik tombol Perbaiki Sekarang untuk mengonversi materi untuk menulis ke kedalaman (yaitu Z-Write On).

Sebelumnya

Buffer Kedalaman Sebelum Memperbaiki Shader Standar MRTK

Sesudahnya

Buffer Kedalaman Tetap MRTK Standard Shader

Text Mesh Pro

Untuk objek Text Mesh Pro, pilih TMP GameObject untuk melihatnya di inspektur. Di bawah komponen bahan, alihkan shader untuk bahan yang ditetapkan untuk menggunakan shader MRTK TextMeshPro.

Perbaikan Buffer Kedalaman Text Mesh Pro

Shader kustom

Jika menulis shader kustom, tambahkan bendera ZWrite ke bagian atas definisi blok Pass untuk mengonfigurasi shader untuk menulis ke buffer kedalaman.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Backing buram

Jika metode di atas tidak berfungsi untuk skenario tertentu (yaitu menggunakan Unity UI), dimungkinkan untuk memiliki penulisan objek lain ke buffer kedalaman. Contoh umumnya adalah menggunakan Teks Antarmuka Pengguna Unity pada panel mengambang dalam adegan. Dengan membuat panel buram atau setidaknya menulis ke kedalaman, maka kedua teks & panel akan distabilkan oleh platform karena nilai z mereka sangat dekat satu sama lain.

WorldAnchors (HoloLens)

Seiring dengan memastikan konfigurasi yang benar terpenuhi untuk memastikan stabilitas visual, penting untuk memastikan hologram tetap stabil di lokasi fisik yang benar. Untuk menginformasikan platform tentang lokasi penting di ruang fisik, pengembang dapat memanfaatkan WorldAnchors pada GameObjects yang perlu tinggal di satu tempat. WorldAnchor adalah komponen yang ditambahkan ke GameObject yang mengambil kontrol absolut atas transformasi objek tersebut.

Perangkat seperti HoloLens terus memindai dan mempelajari lingkungan. Dengan demikian, ketika HoloLens melacak pergerakan & posisi di ruang angkasa, perkiraannya akan diperbarui dan sistem koordinat Unity disesuaikan. Misalnya, jika GameObject ditempatkan 1m dari kamera pada awalnya, karena HoloLens melacak lingkungan, itu mungkin menyadari titik fisik tempat GameObject berada sebenarnya berjarak 1,1m. Ini akan mengakibatkan penyimpangan hologram. Menerapkan WorldAnchor ke GameObject akan memungkinkan jangkar untuk mengontrol transformasi objek sehingga objek akan tetap berada di lokasi fisik yang benar (yaitu memperbarui ke jarak 1,1m, bukan 1m saat runtime). Untuk mempertahankan WorldAnchors di seluruh sesi aplikasi, pengembang dapat menggunakan WorldAnchorStore untuk menyimpan dan memuat WorldAnchors.

Catatan

Setelah komponen WorldAnchor ditambahkan ke GameObject, tidak mungkin untuk memodifikasi transformasi GameObject itu (yaitu transform.position = x). Pengembang harus menghapus WorldAnchor untuk mengedit transformasi.

WorldAnchor m_anchor;

public void AddAnchor()
{
    this.m_anchor = this.gameObject.AddComponent<WorldAnchor>();
}

public void RemoveAnchor()
{
    DestroyImmediate(m_anchor);
}

Jika Anda menginginkan alternatif untuk bekerja secara manual dengan Anchors, lihat Alat Penguncian Dunia Microsoft.

Lihat juga