Jenis data dan presisi Shader
GLSL di Unity

Menggunakan state sampler

Tekstur pasangan dan sampel

Sebagian besar waktu ketika sampling tekstur di shadersProgram yang berjalan di GPU. More info
Lihat di Glossary
, keadaan sampling tekstur harus berasal dari pengaturan tekstur - pada dasarnya, tekstur dan sampler digabungkan bersama. Ini adalah perilaku default ketika menggunakan sintaks warna DX9:

sampler2D _MainTex;
// ...
half4 color = tex2D(_MainTex, uv);

Menggunakan sampler2D, sampler3D, contohrCUBE HLSL kata kunci menyatakan baik tekstur dan sampler.

Sebagian besar waktu ini adalah apa yang Anda inginkan, dan satu-satunya opsi yang didukung pada API grafis yang lebih tua (OpenGL ES).

Tekstur terpisah dan sampel

Banyak API grafis dan GPU memungkinkan menggunakan sampel yang lebih sedikit daripada tekstur, dan tekstur yang digabungkan + sintaks sampel mungkin tidak memungkinkan lebih banyak naungan yang kompleks untuk ditulis. Misalnya, Direct3D 11 memungkinkan menggunakan hingga 128 tekstur dalam naungan tunggal, tetapi hanya hingga 16 sampel.

Unity memungkinkan delaring tekstur dan sampler menggunakan sintaksis HLSL gaya DX11, dengan konvensi naming khusus untuk mencocokkannya: sampler yang memiliki nama dalam bentuk "sampler" +TextureName akan mengambil negara-negara pengambilan sampel dari tekstur itu.

Potongan warna dari bagian di atas dapat ditulis kembali dalam sintaks HLSL gaya DX11, dan itu akan melakukan hal yang sama:

Texture2D _MainTex;
SamplerState sampler_MainTex; // "sampler" + “_MainTex”
// ...
half4 color = _MainTex.Sample(sampler_MainTex, uv);

Namun, cara ini, seorang naungan bisa ditulis untuk "menggunakan" sampel dari tekstur lain, sementara pengambilan lebih dari satu tekstur. Dalam contoh di bawah ini, tiga tekstur sampel, tetapi hanya satu sampler digunakan untuk semua dari mereka:

Texture2D _MainTex;
Texture2D _SecondTex;
Texture2D _ThirdTex;
SamplerState sampler_MainTex; // "sampler" + “_MainTex”
// ...
half4 color = _MainTex.Sample(sampler_MainTex, uv);
color += _SecondTex.Sample(sampler_MainTex, uv);
color += _ThirdTex.Sample(sampler_MainTex, uv);

Perhatikan bahwa sintaksis HLSL gaya DX11 tidak bekerja pada beberapa platform yang lebih tua (misalnya OpenGL ES 2.0), lihat Menggunakan HLSL di Unity untuk rincian. Anda mungkin ingin menentukan #pragma target 3.5 (lihat target kompilasi warna untuk melewatkan platform yang lebih tua dari menggunakan naungan.

Unity menyediakan beberapa makro naungan untuk membantu dengan tekstur delaring dan pengambilan sampel menggunakan pendekatan "separate samplers", lihat makro built-in. Contoh di atas bisa ditulis ulang cara ini, menggunakan makro mengatakan:

UNITY_DECLARE_TEX2D(_MainTex);
UNITY_DECLARE_TEX2D_NOSAMPLER(_SecondTex);
UNITY_DECLARE_TEX2D_NOSAMPLER(_ThirdTex);
// ...
half4 color = UNITY_SAMPLE_TEX2D(_MainTex, uv);
color += UNITY_SAMPLE_TEX2D_SAMPLER(_SecondTex, _MainTex, uv);
color += UNITY_SAMPLE_TEX2D_SAMPLER(_ThirdTex, _MainTex, uv);

Di atas akan mengkompilasi pada semua platform yang didukung oleh Unity, tetapi akan jatuh kembali untuk menggunakan tiga sampel pada platform yang lebih tua seperti DX9.

Inline sampler states

Selain mengenali objek HLSL SamplerState bernama “sampler”+TextureName, Unity juga mengenali beberapa pola lain dalam nama sampler. Ini berguna untuk menentukan keadaan pengambilan sampel hardcoded sederhana langsung di naungan. Contoh:

Texture2D _MainTex;
SamplerState my_point_clamp_sampler;
// ...
half4 color = _MainTex.Sample(my_point_clamp_sampler, uv);

Nama "my_point_clamp_sampler" akan diakui sebagai sampler yang harus menggunakan Point (nearest) penyaringan tekstur, dan Clamp mode pembungkus tekstur.

Nama Sampler diakui sebagai negara sampler “inline” (semua kasus tidak sensitif):

  • “Point”, “Linear” atau “Trilinear” (persyaratan) mengatur mode penyaringan tekstur.

  • “Clamp”, “Repeat”, “Mirror” atau “MirrorOnce” (persyaratan) mengatur mode bungkus tekstur.

    • Mode bungkus dapat ditentukan per sumbu (UVW), misalnya "ClampU_RepeatV".
  • “Compare” (opsional) mengatur sampler untuk perbandingan kedalaman; gunakan dengan tipe HLSL SamplerComparisonState dan SampleCmp / SampleCmpLevel Fungsi nol.

  • “AnisoX” (di mana X bisa 2/4/8 atau 16, misalnya, Ansio8) dapat ditambahkan untuk meminta penyaringan anisotropic.

Berikut adalah contoh tekstur sampling dengan sampler_linear_repeat dan sampler_point_repeat SamplerStates masing-masing, menerangi bagaimana nama mengontrol mode penyaringan:

Berikut ini contoh dengan SmpClampPoint, SmpRepeatPoint, SmpMirrorPoint, SmpMirrorOncePoint, Smp_ClampU_RepeatV_Point SamplerStates masing-masing, menerangi bagaimana kontrol nama mode pembungkus. Dalam contoh terakhir, mode pembungkus yang berbeda diatur untuk aks horizontal (U) dan vertikal (V). Dalam semua kasus, koordinat tekstur pergi dari -2.0 ke + 2.0.

Sama seperti tekstur terpisah + sintaksis sampler, state sampler inline tidak didukung pada beberapa platform. Saat ini mereka diimplementasikan pada Direct3D 11/12 dan Logam.

Perhatikan bahwa mode pembungkus tekstur "MirrorOnce" tidak didukung pada GPU / API paling seluler, dan akan jatuh kembali ke mode Cermin ketika dukungan tidak hadir.

Perhatikan bahwa mode penyaringan "AnisoX" adalah upaya terbaik berdasarkan kemampuan platform dan API yang dipilih. Nilai sebenarnya akan dijepit berdasarkan tingkat anisotropic yang didukung maksimum (termasuk dinonaktifkan dalam kasus di mana tidak ada penyaringan anisotropic didukung).


  • 2017–06–01 Sitemap

  • Fitur baru dalam NewIn20171

Jenis data dan presisi Shader
GLSL di Unity