Reflektor built-in termasuk file
Fungsi bantuan naungan built-in

makro built-in

Unity mendefinisikan beberapa makro praprosesor ketika membandingkan Program Shader.

Platform sasaran

Macro: Target platform:
SHADER_API_D3D11 WinZip 11
SHADER_API_GLCORE Desktop OpenGL “core” (GL 3/4)
SHADER_API_GLES OpenGL ES 2.0
SHADER_API_GLES3 RealPlayer Cloud 18.1.11.204
SHADER_API_METAL iOS/Mac Logam
SHADER_API_VULKAN Vulkan
SHADER_API_D3D11_9X Direct3D 11 "tingkat adaptor 9.x" target untuk Universal Windows PlatformFitur IAP yang mendukung simulator Pembelian Aplikasi Microsoft, yang memungkinkan Anda untuk menguji aliran pembelian IAP pada perangkat sebelum menerbitkan aplikasi Anda. More info
Lihat di Glossary

SHADER_API_MOBILE didefinisikan untuk semua platform seluler umum (GLES, GLES3, METAL).

Selain itu, SHADER_TARGET_GLSL didefinisikan ketika bahasa pencukur target adalah GLSL (selalu benar untuk platform OpenGL / GLES).

Model sasaran Shader

SHADER_TARGET didefinisikan untuk nilai numerik yang cocok dengan model kompilasi target ShaderProgram yang berjalan di GPU. More info
Lihat di Glossary
(yaitu, pencocokan langsung #pragma target). Sebagai contoh, SHADER_TARGET adalah 30 ketika mematuhi model Shader 3.0. Anda dapat menggunakannya dalam kode Shader untuk melakukan pemeriksaan kondisional. Contoh:

#if SHADER_TARGET < 30
    // less than Shader model 3.0:
    // very limited Shader capabilities, do some approximation
#else
    // decent capabilities, do a better thing
#endif

versi Unity

UNITY_VERSION mengandung nilai numerik dari versi Unity. Sebagai contoh, UNITY_VERSION adalah 501 untuk Unity 5.0.1. Ini dapat digunakan untuk perbandingan versi jika Anda perlu menulis Shaders yang menggunakan fungsi Shader built-in yang berbeda. Misalnya, pemeriksaan preprocessor #if UNITY_VERSION >= 500 hanya melewati versi 5.0.0 atau kemudian.

Tahap Shader disusun

Preprocessor makro SHADER_STAGE_VERTEX, SHADER_STAGE_FRAGMENT, SHADER_STAGE_DOMAIN, SHADER_STAGE_HULL, SHADER_STAGE_GEOMETRY didefinisikan ketika membandingkan setiap tahap Shader. Biasanya mereka berguna ketika berbagi kode Shader antara peredam SHADER_STAGE_COMPUTE dan pewarna, untuk menangani kasus di mana beberapa hal harus dilakukan sedikit berbeda.pixelUnit terkecil dalam gambar komputer. Ukuran piksel tergantung pada resolusi layar Anda. Pencahayaan pixel dihitung pada setiap piksel layar. More info
Lihat di Glossary
Shaders and compute Shaders, to handle cases where some things have to be done slightly differently.

Platform difference helpers

Penggunaan langsung dari makro platform ini didiskusikan, karena mereka tidak selalu berkontribusi pada masa depan-bukti kode Anda. Misalnya, jika Anda menulis Shader yang mengecek D3D11, Anda mungkin ingin memastikan bahwa, di masa depan, cek diperpanjang untuk menyertakan Vulkan. Sebagai gantinya, Unity mendefinisikan beberapa makro pembantu (dalam HLSLSupport.cginc):

Macro: Use:
UNITY_BRANCH Tambahkan ini sebelum pernyataan bersyarat untuk memberitahu kompiler bahwa ini harus dikompilasi ke cabang yang sebenarnya. Memperluas hingga [branch] ketika pada platform HLSL.
UNITY_FLATTEN Tambahkan ini sebelum pernyataan bersyarat untuk memberitahu kompiler bahwa ini harus diratakan untuk menghindari instruksi cabang yang sebenarnya. Memperluas hingga [flatten] ketika pada platform HLSL.
UNITY_NO_SCREENSPACE_SHADOWS Didefinisikan pada platform yang tidak menggunakan bayangan bayangan ruang layar kader (platform seluler).
UNITY_NO_LINEAR_COLORSPACE Didefinisikan pada platform yang tidak mendukung ruang warna linier (platform seluler).
UNITY_NO_RGBM Ditetapkan pada platform di mana RGBM compressionMetode menyimpan data yang mengurangi jumlah ruang penyimpanan yang dibutuhkan. Kompresi Tekstur, Kompresi Animasi, Kompresi Audio, Membangun Kompresi.
Lihat di Glossary
untuk lightmapsTekstur pra-render yang mengandung efek sumber cahaya pada objek statis di tempat kejadian. Lightmaps dilalui atas geometri adegan untuk menciptakan efek pencahayaan. More info
Lihat di Glossary
tidak digunakan (platform seluler).
UNITY_NO_DXT5nm Ditetapkan pada platform yang tidak menggunakan kompresi peta normal DXT5nm (platform seluler).
UNITY_FRAMEBUFFER_FETCH_AVAILABLE Didefinisikan pada platform di mana fungsi jantan warna yang berbeda dapat tersedia (platform iOS secaragenerally - OpenGL ES 2.0, 3.0 dan Metal).
UNITY_USE_RGBA_FOR_POINT_SHADOWS Didefinisikan pada platform di mana titik bayangan cahaya menggunakan RGBA Tekstur dengan kedalaman yang dikodekan (platform lain menggunakan Tekstur titik mengambang satu saluran).
UNITY_ATTEN_CHANNEL Defines yang saluran tekstur attenuasi cahaya mengandung data; digunakan dalam kode pencahayaan per-piksel. Sitemap
UNITY_HALF_TEXEL_OFFSET Didefinisikan pada platform yang membutuhkan penyesuaian offset setengah-texel dalam pemetaan texels ke piksel (misalnya Direct3D 9).
UNITY_UV_STARTS_AT_TOP Selalu didefinisikan dengan nilai 1 atau 0. Nilai 1 adalah pada platform di mana Tekstur V berkoordinasi adalah 0 di "top" Tekstur. Platform langsung3D-seperti menggunakan nilai 1; Platform terbukaGL-seperti menggunakan nilai 0.
UNITY_MIGHT_NOT_HAVE_DEPTH_Texture Didefinisikan jika platform mungkin meniru peta bayangan atau Tekstur kedalaman secara manual dengan rendering kedalaman ke dalam Tekstur.
UNITY_PROJ_COORD(a) Mengingat vektor 4-komponen, ini mengembalikan koordinat Tekstur yang cocok untuk pembacaan Tekstur yang diproyeksikan. Pada sebagian besar platform ini kembali nilai yang diberikan secara langsung.
UNITY_NEAR_CLIP_VALUE Didefinisikan nilai dekat clipping planePesawat yang membatasi seberapa jauh atau menutup kamera dapat melihat dari posisi saat ini. Berbagai tampilan kamera adalah antara pesawat klip jauh dan dekat. Lihat pesawat klip jauh dan dekat pesawat kliping. More info
Lihat di Glossary
. Platform langsung3D-seperti menggunakan 0,0 sementara penggunaan platform OpenGL-like -1.0.
UNITY_VPOS_TYPE Tentukan jenis data yang diperlukan untuk input posisi piksel (VPOS): float2 pada D3D9, float4 di tempat lain.
UNITY_CAN_COMPILE_TESSELLATION Didefinisikan ketika kompiler Shader “understands” sintaksis Shader HLSL (saat ini hanya D3D11).
UNITY_INITIALIZE_OUTPUT(type,name) Menginisialisasi variabel name dari diberikan type ke nol.
UNITY_COMPILER_HLSL, UNITY_COMPILER_HLSL2GLSL, UNITY_COMPILER_CG Menunjukkan kompilator Shader digunakan untuk mengkompilasi Shaders. Lihat dokumentasi tentang Shader kompilasi untuk rincian lebih lanjut. Gunakan ini jika Anda menjalankan perbedaan penanganan sintaks Shader yang sangat spesifik antara kompiler, dan ingin menulis kode yang berbeda untuk setiap kompiler.
  • UNITY_REVERSED_Z - didefinisikan pada plaftorms menggunakan penyangga Z terbalik. Nilai-nilai Z yang tersimpan dalam kisaran 1..0 bukan 0...1.

Shadow mapping macros

Menulis dan pengambilan peta bayangan dapat sangat berbeda tergantung pada platform. Unity memiliki beberapa makro untuk membantu dengan ini:

Macro: Use:
UNITY_DECLARE_SHADOWMAP(tex) Tentukan variabel tekstur bayangan dengan nama "tex".
UNITY_SAMPLE_SHADOW(tex,uv) Contoh bayangan peta Tekstur "tex" pada "uv" yang diberikan (Komponen XY adalah lokasi Tekstur, komponen Z adalah kedalaman untuk dibandingkan dengan). Kembalikan nilai float tunggal dengan istilah bayangan dalam kisaran 0..1.
UNITY_SAMPLE_SHADOW_PROJ(tex,uv) Mirip di atas, tetapi apakah peta bayangan proyektif dibaca. “uv” adalah float4, semua komponen lain dibagi dengan .w untuk melakukan lookup.

Sitemap Tidak semua kartu grafis mendukung bayangan peta. Gunakan NOTE: untuk memeriksa dukungan.SystemInfo.SupportsRenderTextureFormat to check for support.

makro penyangga konstan

Direct3D 11 kelompok semua variabel Shader menjadi “sersi terus-menerus”. Sebagian besar variabel bawaan Unity sudah dikelompokkan, tetapi untuk variabel di Shaders Anda sendiri mungkin lebih optimal untuk menempatkan mereka ke buffer konstan terpisah tergantung pada frekuensi pembaruan yang diharapkan.

Gunakan makro CBUFFER_START(name) untuk itu:CBUFFER_END macros for that:

CBUFFER_START(MyRarelyUpdatedVariables)
    float4 _SomeGlobalValue;
CBUFFER_END

Tekstur/Sampler deklarasi makro

Biasanya Anda akan menggunakan texture2D dalam kode Shader untuk menyatakan pasangan Tekstur dan Sampler. Namun pada beberapa platform (seperti DX11), Tekstur dan Sampler adalah benda terpisah, dan jumlah Sampler maksimum yang mungkin cukup terbatas. Unity memiliki beberapa makro untuk menyatakan Tekstur tanpa Sampler, dan untuk sampel Tekstur menggunakan Sampler dari Tekstur lain. Gunakan ini jika Anda berakhir berjalan ke batas Sampler, dan Anda tahu bahwa beberapa Tekstur Anda dapat sebenarnya berbagi Sampler (Samplers mendefinisikan penyaringan Tekstur dan mode pembungkus).

Macro: Use:
UNITY_DECLARE_TEX2D(name) Jelaskan pasangan Tekstur dan Sampler.
UNITY_DECLARE_TEX2D_NOSAMPLER(name) Jelaskan Tekstur tanpa Sampler.
UNITY_DECLARE_TEX2DARRAY(name) Tentukan variabel Sampler array Tekstur.
UNITY_SAMPLE_TEX2D(name,uv) Sampel dari pasangan Tekstur dan Sampler, menggunakan koordinat Tekstur yang diberikan.
UNITY_SAMPLE_TEX2D_SAMPLER( name,samplername,uv) Contoh dari Tekstur (nama), menggunakan Sampler dari Tekstur lain (nama sampel).
UNITY_SAMPLE_TEX2DARRAY(name,uv) Contoh dari array Tekstur dengan UV float3; komponen z koordinat adalah indeks elemen array.
UNITY_SAMPLE_TEX2DARRAY_LOD(name,uv,lod) Contoh dari array Tekstur dengan tingkat mipmap eksplisit.

Untuk informasi lebih lanjut, lihat dokumentasi pada Sampler States.

Permukaan Shader lulus indikator

Ketika Permukaan ShaderCara merampingkan naungan menulis untuk Pipeline Render Built-in. More info
Lihat di Glossary
dikompilasi, mereka menghasilkan banyak kode untuk berbagai melewati untuk melakukan pencahayaan. Ketika membandingkan setiap lulus, salah satu makro berikut didefinisikan:

Macro: Use:
UNITY_PASS_FORWARDBASE Forward renderingSebuah jalur rendering yang membuat setiap objek dalam satu atau lebih melewati, tergantung pada lampu yang mempengaruhi objek. Lampu sendiri juga diperlakukan berbeda dengan Rendering Maju, tergantung pada pengaturan dan intensitas mereka. More info
Lihat di Glossary
base pass (terutama directional light, lightmaps, SH).
UNITY_PASS_FORWARDADD Maju rendering aditif lulus (satu cahaya per lulus).
UNITY_PASS_DEFERRED Deferred shadingSebuah jalur rendering di Pipa Render Built-in yang tidak membatasi jumlah Lampu yang dapat mempengaruhi GameObject. Semua Lampu dievaluasi per-piksel, yang berarti bahwa mereka semua berinteraksi dengan peta normal dan sebagainya. Selain itu, semua Lampu bisa memiliki cookie dan bayangan. More info
Lihat di Glossary
lulus (renders G-buffer).
UNITY_PASS_SHADOWCASTER Bayangan caster dan kedalaman Tekstur rendering lulus.
UNITY_PASS_PREPASSBASE Basis pencahayaan deferred Empire lulus (render normal dan exponent specular).
UNITY_PASS_PREPASSFINAL Lulusan akhir pencahayaan deferred Legacy (menerapkan pencahayaan dan Tekstur).

Nonaktifkan Auto-Upgrade

UNITY_SHADER_NO_UPGRADE memungkinkan Anda untuk menonaktifkan Unity dari upgrade otomatis atau memodifikasi file naungan Anda.

Kedalaman Tekstur helper makro

Sebagian besar waktu, Tekstur Kedalaman digunakan untuk membuat Kedalaman dari CameraKomponen yang menciptakan gambar sudut pandang tertentu di tempat kejadian Anda. Output ditarik ke layar atau ditangkap sebagai tekstur. More info
Lihat di Glossary
. UnityCG.cginc termasuk file mengandung beberapa makro untuk menangani kompleksitas di atas dalam kasus ini:

  • UNITY_TRANSFER_DEPTH(o): mengimbangi kedalaman ruang mata simpul dan output dalam o (yang harus menjadi float2). Gunakan dalam program simpul ketika rendering ke dalam tekstur kedalaman. Pada platform dengan tekstur kedalaman asli makro ini tidak ada sama sekali, karena nilai penyangga Z dirender secara implicitly.
  • UNITY_OUTPUT_DEPTH(i): mengembalikan kedalaman ruang mata dari i (yang harus menjadi float2). Gunakan dalam program fragmen ketika rendering ke dalam tekstur kedalaman. Pada platform dengan tekstur kedalaman asli makro ini selalu kembali nol, karena nilai penyangga Z dirender secara implicitly.
  • COMPUTE_EYEDEPTH(i): mengimbangi kedalaman ruang mata simpul dan output dalam o. Gunakan dalam program simpul ketika not rendering ke dalam tekstur kedalaman.
  • DECODE_EYEDEPTH(i)/LinearEyeDepth(i): diberikan nilai presisi tinggi dari tekstur kedalaman i, mengembalikan kedalaman ruang mata yang sesuai.
  • Linear01Depth(i): diberikan nilai presisi tinggi dari tekstur kedalaman i, kembali sesuai kedalaman linier dalam kisaran antara 0 dan 1.

Sitemap Pada DX11/12 dan Logam, kisaran penyangga Z adalah 1-0 dan UNITY_REVERSED_Z didefinisikan. Di platform lain, kisaran 0–1.Note: On DX11/12 and Metal, the Z buffer range is 1–0 and UNITY_REVERSED_Z is defined. On other platforms, the range is 0–1.

Misalnya, naungan ini akan membuat kedalaman GameObjectsObjek 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
:

Shader "Render Depth" {
    SubShader {
        Tags { "RenderType"="Opaque" }
        Pass {
            CGPROGRAM

            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f {
                float4 pos : SV_POSITION;
                float2 depth : TEXCOORD0;
            };

            v2f vert (appdata_base v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                UNITY_TRANSFER_DEPTH(o.depth);
                return o;
            }

            half4 frag(v2f i) : SV_Target {
                UNITY_OUTPUT_DEPTH(i.depth);
            }
            ENDCG
        }
    }
}
Reflektor built-in termasuk file
Fungsi bantuan naungan built-in