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.
VPAndRTArrayIndexFromAnyShaderFeedingRasterizer
.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.
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.
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;
}
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;
}
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;
}
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.
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
}
}
}