Unity mendefinisikan beberapa makro praprosesor ketika membandingkan Program Shader.
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).
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
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.
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.
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.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.
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
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.
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). |
UNITY_SHADER_NO_UPGRADE
memungkinkan Anda untuk menonaktifkan Unity dari upgrade otomatis atau memodifikasi file naungan Anda.
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:
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
}
}
}