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, aplikasi realitas campuran yang memenuhi framerate 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 perangkat platform & . 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 tampak tidak akurat secara visual. 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 yang dapat digunakan pengembang 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 Late-Stage Reprojection.

Proyeksi ulang tahap akhir

Pada akhir penyajian bingkai, platform Windows Mixed Reality mengambil target render kedalaman warna & yang dihasilkan oleh aplikasi dan mengubah output layar akhir untuk memperhitungkan pergerakan kepala sedikit sejak prediksi pose kepala terakhir. Perulangan permainan aplikasi membutuhkan waktu untuk dieksekusi. Misalnya, pada 60 FPS, ini berarti aplikasi mengambil ~16,667ms untuk merender bingkai. Meskipun ini mungkin tampak seperti sedikit waktu, 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 memperkirakan 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 Late-Stage Reprojection akan dilakukan per piksel atau melalui sarana 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. Piksel yang mewakili bola akan memiliki transformasi yang berbeda dari piksel jauh yang mewakili piksel jika pengguna telah sedikit memiringkan kepala mereka. Proyeksi ulang per piksel akan mempertimbangkan 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 LSR lain 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 pesawat dapat disediakan ke platform melalui HolographicSettings.SetFocusPointForFrameAPI 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 umumnya 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 diambil pengembang.

  1. Di bawah Edit>Project Pengaturan>Player>XR Pengaturan>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 teks transparan & 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

Depth Buffer Before Fix MRTK Standard Shader

Sesudahnya

Depth Buffer Fixed MRTK Standard Shader

Mesh Pro Teks

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

Text Mesh Pro Depth Buffer Fix

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 objek lain yang menulis 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 di 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, karena HoloLens melacak posisi pergerakan & 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 1,1m jauhnya. 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 pembaruan ke 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 tersebut (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 Jangkar, lihat Alat Penguncian Dunia Microsoft.

Lihat juga