Single Pass Stereo rendering (Double-Wide rendering)
Single-Pass Stereo Rendering untuk HoloLens

Login Login

Dengan rendering Single Pass Instanced (juga dikenal sebagai Stereo Instancing), GPU melakukan lulus render tunggal, mengganti setiap panggilan penarikan dengan panggilan penarikan yang dicontoh. Ini sangat mengurangi penggunaan CPU, dan sedikit mengurangi penggunaan GPU, karena cache koherensi antara dua panggilan menggambar. Ini secara signifikan mengurangi konsumsi daya aplikasi Anda.

Platform yang didukung

  • Mozilla Firefox
  • Oculus Rift (DirectX 11)
  • HoloLens
  • Magic Leap
  • Perangkat Android yang mendukung ekstensi Multiview
  • Untuk DirextX di desktop, GPU harus mendukung perpanjangan Direct3D 11 dan ekstensi VPAndRTArrayIndexFromAnyShaderFeedingRasterizer.
  • Untuk OpenGL di desktop, GPU harus mendukung salah satu ekstensi berikut:
    • GL_NV_viewport_array2
    • GL_AMD_vertex_shader_layer
    • GL_ARB_shader_viewport_layer_array

Sitemap Unity tidak mendukung Single Pass Stereo Instancing di Legacy Note: ketika menggunakan Deferred Rendering.Render PipelineRangkaian operasi yang mengambil isi dari Adegan, dan menampilkannya di layar. Unity memungkinkan Anda memilih dari pipa render yang dibangun sebelumnya, atau menulis sendiri. More info
Lihat di Glossary
when using Deferred Rendering.

Untuk mengaktifkan fitur ini, buka pengaturan Player (ke Edit > Project SettingsPengumpulan yang luas dari pengaturan yang memungkinkan Anda untuk mengkonfigurasi bagaimana Fisika, Audio, Jaringan, Grafik, Input dan banyak bidang lain dari jangkauan proyek Anda. More info
Lihat di Glossary
, kemudian pilih kategori Player). Dalam pengaturan Player, arahkan ke panel XR Settings di bagian bawah, periksa opsi Virtual Reality Supported, kemudian pilih Single Pass Instanced (Preview) dari menu drop-down Stereo Rendering Method.

In the XR Settings panel, set the Stereo Rendering Method to Single Pass Instanced (Preview)
Di panel Pengaturan XR, atur Metode Pengirim Stereo ke Instanced Pass Tunggal (Preview)

Default Stereo Rendering Method adalah Multi Pass. Pengaturan ini lebih lambat, tetapi biasanya bekerja lebih baik dengan shadersProgram yang berjalan di GPU. More info
Lihat di Glossary
kustom. Jika Anda memiliki naungan kustom, Anda mungkin perlu mengubahnya untuk membuat mereka kompatibel dengan rendering Single Pass Instanced.

Catalog

Sebelum Anda mengikuti instruksi di bawah ini, perbarui naungan kustom Anda untuk menggunakan hukuman (lihat Login Login).

Selanjutnya, Anda perlu membuat dua perubahan tambahan pada tahap naungan terakhir yang digunakan sebelum naungan fragmen (Vertex/Hull/Domain/Geometry) untuk setiap naungan kustom Anda.

Untuk setiap warna kustom Anda ingin mendukung Single Pass Instancing, melaksanakan langkah-langkah berikut:

Sitemap Tambahkan Step 1: ke UNITY_VERTEX_INPUT_INSTANCE_ID.appdata struct.

Contoh:

struct appdata
{
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;

    UNITY_VERTEX_INPUT_INSTANCE_ID //Insert
};

Sitemap Tambahkan Step 2: ke UNITY_VERTEX_OUTPUT_STEREO.v2f output struct.

Contoh:

struct v2f
{
    float2 uv : TEXCOORD0;
    float4 vertex : SV_POSITION;

    UNITY_VERTEX_OUTPUT_STEREO //Insert
};

Sitemap Tambahkan makro Step 3: pada awal metode UNITY_SETUP_INSTANCE_ID() utama Anda, diikuti dengan panggilan ke vert dan UNITY_INITIALIZE_OUTPUT(v2f, o).UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO().

UNITY_SETUP_INSTANCE_ID() menghitung dan mengatur variabel naungan built-in unity_StereoEyeIndex dan unity_InstanceID ke nilai yang benar berdasarkan mata GPU saat ini rendering.

UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO memberitahu GPU yang mata dalam array tekstur harus render ke, berdasarkan nilai unity_StereoEyeIndex. makro ini juga mentransfer nilai unity_StereoEyeIndex dari vertex shaderProgram yang berjalan pada setiap simpul model 3D ketika model sedang diberikan. More info
Lihat di Glossary
sehingga akan dapat diakses dalam warna fragmen hanya jika UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX disebut dalam metode naungan fragmen frag.

UNITY_INITALIZE_OUTPUT(v2f,o) menginisialisasi semua nilai v2f menjadi 0.

Contoh:

v2f vert (appdata v)
{
    v2f o;

    UNITY_SETUP_INSTANCE_ID(v); //Insert
    UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert

    o.vertex = UnityObjectToClipPos(v.vertex);

    o.uv = v.uv;

    return o;
}

Post-Processing naungan

Jika Anda ingin naungan Post-ProcessingProses yang meningkatkan visual produk dengan menerapkan filter dan efek sebelum gambar muncul di layar. Anda dapat menggunakan efek pasca proses untuk mensimulasikan kamera fisik dan sifat film, misalnya Bloom dan Kedalaman Lapangan. More info pemrosesan pos, pasca proses, pasca proses
Lihat di Glossary
Anda untuk mendukung Single Pass Instancing, ikuti langkah-langkah di warna khusus serta langkah-langkah di bawah ini. Anda dapat mengunduh semua naungan dasar Unity scriptsSepotong kode yang memungkinkan Anda untuk membuat Komponen Anda sendiri, memicu peristiwa permainan, memodifikasi sifat komponen dari waktu ke waktu dan menanggapi input pengguna dengan cara apa pun yang Anda sukai. More info
Lihat di Glossary
dari .

Lakukan hal berikut untuk setiap warna Post-Processing yang ingin Anda dukung Single Pass Instancing:

Sitemap Tambahkan UNITY_DECLARE_SCREENSPACE_TEXTURE(tex) makro di luar metode frag (lihat contoh penempatan di bawah) dalam skrip Shader Anda, sehingga ketika Anda menggunakan metode rendering stereo tertentu GPU menggunakan sampler tekstur yang sesuai. Misalnya, jika Anda menggunakan rendering Multi-Pass, GPU menggunakan sampler 2D tekstur. Untuk rendering multi-view, sampler tekstur adalah array tekstur.Step 1: Add the UNITY_DECLARE_SCREENSPACE_TEXTURE(tex) macro outside the frag method (see the placement example below) in your Shader script, so that when you use a particular stereo rendering method the GPU uses the appropriate texture sampler. For example, if you use Multi-Pass rendering, the GPU uses a texture 2D sampler. For single pass instancing or multi-view rendering, the texture sampler is a texture array.

Sitemap Tambahkan Step 2: pada awal metode frag warna frag frag frag frag (Lihat contoh penempatan di bawah). Anda hanya perlu menambahkan makro ini jika Anda ingin menggunakan variabel naungan bawaan UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i) untuk mengetahui mata GPU rendering ke. Ini berguna ketika menguji efek pasca pemrosesan.unity_StereoEyeIndex built-in shader variable to find out which eye the GPU is rendering to. This is useful when testing post processing effects.

Sitemap Gunakan makro Step 3: ketika sampling 2D tekstur (Lihat contoh penempatan di bawah). Warna standar menggunakan penyangga punggung berbasis tekstur 2D untuk tekstur sampel. Satu Pass Stereo Instancing tidak menggunakan jenis penyangga belakang ini, jadi jika Anda tidak menentukan metode yang berbeda untuk pengambilan gambar tekstur 2D, naungan Anda tidak render dengan benar. Untuk mencegah masalah rendering, makro UNITY_SAMPLE_SCREENSPACE_TEXTURE() mendeteksi stereo UNITY_SAMPLE_SCREENSPACE_TEXTURE() yang Anda gunakan dan kemudian secara otomatis sampel tekstur dengan cara yang benar. Lihat dokumentasi Unity pada rendering pathTeknik yang menggunakan pipa render untuk membuat grafik. Memilih jalur rendering yang berbeda mempengaruhi bagaimana pencahayaan dan pembentukan dihitung. Beberapa jalur rendering lebih cocok untuk berbagai platform dan perangkat keras daripada yang lain. More info
Lihat di Glossary
untuk mempelajari lebih lanjut tentang makro serupa yang digunakan untuk tekstur mendalam dan peta bayangan ruang layar.HLSLSupport.cginc to learn more about similar macros used for depth textures and screen-space shadow maps.

Contoh:

UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); //Insert

fixed4 frag (v2f i) : SV_Target
{
    UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); //Insert
    
    fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv); //Insert
    
    // just invert the colors
    
    col = 1 - col;
    
    return col;
}

Kode naungan sampel penuh

Di bawah ini adalah contoh sederhana dari naungan efek gambar template dengan semua perubahan yang disebutkan sebelumnya diterapkan untuk memungkinkan dukungan Single Pass Instancing. Selain kode naungan ditandai dengan komentar (//Insert).

struct appdata
{
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;
    
    UNITY_VERTEX_INPUT_INSTANCE_ID //Insert
};

//v2f output struct

struct v2f
{

    float2 uv : TEXCOORD0;
    float4 vertex : SV_POSITION;
    
    UNITY_VERTEX_OUTPUT_STEREO //Insert
};

v2f vert (appdata v)
{
    v2f o;
    
    UNITY_SETUP_INSTANCE_ID(v); //Insert
    UNITY_INITIALIZE_OUTPUT(v2f, o); //Insert
    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //Insert
    
    o.vertex = UnityObjectToClipPos(v.vertex);
    o.uv = v.uv;
    return o;
}

UNITY_DECLARE_SCREENSPACE_TEXTURE(_MainTex); //Insert

fixed4 frag (v2f i) : SV_Target
{
    UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i); //Insert
    
    fixed4 col = UNITY_SAMPLE_SCREENSPACE_TEXTURE(_MainTex, i.uv); //Insert
    
    // invert the colors
    
    col = 1 - col;
    
    return col;
}

Geometri prosedural

Ketika menggunakan metode Grafik.DrawProceduralIndirect() dan CommandBuffer.DrawProceduralIndirect() untuk menggambar geometri prosedural penuh pada GPU, penting untuk dicatat bahwa kedua metode menerima argumen mereka dari buffer compute. Ini berarti bahwa sulit untuk meningkatkan jumlah instance pada waktu berjalan. Untuk meningkatkan jumlah instance, Anda perlu secara manual menggandakan jumlah instance yang terkandung dalam buffer compute Anda.

Debugging naungan Anda

Kode naungan berikut menghasilkan GameObjectObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary
sebagai hijau untuk mata kiri pengguna dan merah untuk mata kanan mereka. Naungan ini berguna untuk debugging rendering stereo Anda, karena memungkinkan Anda untuk memverifikasi bahwa semua pekerjaan grafis stereo dan berfungsi dengan benar.

Shader "XR/StereoEyeIndexColor"
{
   Properties
   {
       _LeftEyeColor("Left Eye Color", COLOR) = (0,1,0,1)
       _RightEyeColor("Right Eye Color", COLOR) = (1,0,0,1)
   }

   SubShader
   {
      Tags { "RenderType" = "Opaque" }

      Pass
      {
         CGPROGRAM

         #pragma vertex vert
         #pragma fragment frag

         float4 _LeftEyeColor;
         float4 _RightEyeColor;

         #include "UnityCG.cginc"

         struct appdata
         {
            float4 vertex : POSITION;

            UNITY_VERTEX_INPUT_INSTANCE_ID
         };

         struct v2f
         {
            float4 vertex : SV_POSITION;

            UNITY_VERTEX_INPUT_INSTANCE_ID 
            UNITY_VERTEX_OUTPUT_STEREO
         };

         v2f vert (appdata v)
         {
            v2f o;

            UNITY_SETUP_INSTANCE_ID(v);
            UNITY_INITIALIZE_OUTPUT(v2f, o);
            UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);

            o.vertex = UnityObjectToClipPos(v.vertex);

            return o;
         }

         fixed4 frag (v2f i) : SV_Target
         {
            UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);

            return lerp(_LeftEyeColor, _RightEyeColor, unity_StereoEyeIndex);
         }
         ENDCG
      }
   }
}
Single Pass Stereo rendering (Double-Wide rendering)
Single-Pass Stereo Rendering untuk HoloLens