ShaderLab: menambahkan program naungan
ShaderLab: perintah

ShaderLab: menentukan persyaratan paket

Beberapa shadersProgram yang berjalan di GPU. More info
Lihat di Glossary
perlu mendukung beberapa render pipelinesRangkaian 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
secara bersamaan. Menambahkan persyaratan paket ke SubShaders dan Passes memungkinkan Anda untuk menghindari kesalahan kompilasi ketika kode naungan menggunakan file termasuk dari paket yang tidak diinstal atau memerlukan versi paket tertentu untuk dikompilasi.

Kompatibilitas pipa Render

Feature name Built-in Render Pipeline Universal Render Pipeline (URP) High Definition Render Pipeline (HDRP) Custom SRP
ShaderLabUnity’s language for defining the structure of Shader objects. More info
See in Glossary
: PackageRequirements block
Yes Yes Yes Yes

Menggunakan blok Pertanyaan

Untuk menentukan persyaratan paket untuk SubShader atau Pass, Anda menggunakan blok PackageRequirements. ShaderLab mendukung blok PackageRequirements tunggal per SubShader atau Pass, tetapi setiap blok dapat menentukan beberapa persyaratan paket.

Note: jika Anda menyediakan blok PackageRequirements, itu harus datang sebelum semua deklarasi lain di dalam SubShader atau Pass.

Signature Function
PackageRequirements{ [requirement definition]} Tentukan persyaratan paket untuk Pass atau SubShader.

Ada beberapa cara untuk menyatakan persyaratan paket. Setiap orang memberikan perilaku yang berbeda. Mereka adalah:

  • “<package name>”: Menentukan bahwa SubShader atau Pass bekerja dengan versi paket apa pun.
  • “<package name>”: “<version restrictions>”: Tentukan bahwa SubShader atau Pass hanya bekerja dengan subset versi paket.
  • “<package name>”: “unity=<version restrictions>”: Tentukan bahwa SubShader atau Pass hanya bekerja dengan subset versi Unity dan membutuhkan paket dengan nama yang diberikan.
  • “unity”:“<version restrictions>”: Tentukan bahwa SubShader atau Pass hanya bekerja dengan subset versi Unity.

Pembatasan versi mendefinisikan satu set rentang versi. Jika versi yang diinstal dari paket yang diperlukan tidak berada di dalam kisaran, persyaratan paket tidak terpenuhi. Demikian pula, jika persyaratan menentukan satu set pembatasan versi Unity, yang sama berlaku untuk versi Unity saat ini. Untuk informasi tentang sintaks pembatasan versi, lihat Versi sintaks.

Jika SubShader atau Pass menyatakan persyaratan paket bahwa proyek tidak memenuhi, Unity tidak termasuk SubShader atau Pass dari pemrosesan dan kompilasi lebih lanjut. Ini terjadi jika proyek tidak termasuk paket yang diperlukan, atau menyertakannya tetapi tidak dengan versi yang kompatibel. Jika seorang naungan tidak mengandung SubShader tunggal yang memenuhi persyaratan, atau jika tidak ada SubShader mengandung Passes yang memenuhi persyaratan, Console windowJendela Unity Editor yang menunjukkan kesalahan, peringatan dan pesan lain yang dihasilkan oleh Unity, atau skrip Anda sendiri. More info
Lihat di Glossary
menunjukkan pesan peringatan.

Versi sintaks

Dalam persyaratan paket ShaderLab, versi menggunakan format major.minor atau major.minor.patch. Jika Anda hanya menggunakan major.minor, Unity menggunakan 0 untuk patch. Versi paket juga dapat mencakup postfix -preview atau -preview.n di mana -preview setara dengan -preview.0. Versi Pratinjau datang sebelum versi non-preview, jadi 1.2.3-preview.4 datang setelah 1.2.2 tetapi sebelum 1.2.3.

Ada beberapa cara untuk menentukan rentang versi. Setiap orang memberikan perilaku yang berbeda. Mereka adalah:

  • <version>: Sertakan versi yang Anda masukkan dan semua versi setelah itu. Sebagai contoh, 1.2.3 mencakup semua versi yang dimulai dengan 1.2.3;
  • [<version>]: Tentukan versi yang tepat. Sebagai contoh, [1.2.3] hanya mencakup versi 1.2.3;
  • [<version1>,<version2>]: Tentukan kisaran antara <version1> dan <version2>. Menggunakan braket persegi dan braket bundar menyebabkan kisarannya termasuk atau termasuk versi masing-masing. Braket pembukaan mempengaruhi <versi1> dan braket penutupan mempengaruhi <version2>. Contoh: [1.2.3,2.3.4) mencakup semua versi dari 1.2.3 ke 2.3.3.

Anda juga dapat menentukan set rentang versi untuk paket tunggal. Untuk membuat satu set rentang versi dari rentang individu, gunakan semikolon sebagai pemisah. Sebagai contoh, [2.0,3.4.5];[3.7];4.0 mencakup versi dari 2.0.0 ke 3.4.5, versi 3.7.0, dan versi 4.0.0 dan di atas.

Ketika Anda mengatur versi untuk paket, menyadari hal berikut:

  • Versi, rentang versi, dan set rentang versi tidak dapat mengandung karakter tambahan.
  • Rentang versi tidak bisa kosong.
  • Pengaturan rentang versi tidak dapat memiliki persimpangan.

Jika sintaks tidak mematuhi di atas, pembatasan versi tidak valid. Untuk informasi lebih lanjut tentang apa yang terjadi dengan persyaratan paket yang tidak valid, lihat Pemeriksaan kesalahan.

Example

Contoh kode berikut menunjukkan bagaimana menentukan persyaratan paket di SubShader dan Pass. SubShader menyatakan persyaratan paket tunggal untuk paket yang disebut “com.my.package” dan bekerja dengan versi paket ini dimulai dari 2.2.0. SubShader memiliki dua Passes:

  • Pass pertama membutuhkan:

  • Universal Render Pipeline paket dengan versi antara 10.2.1 dan 11.0.

  • Teks MeshGrafik utama primitif Unity. Mesh membuat sebagian besar dunia 3D Anda. Unity mendukung mesh poligon triangulat atau Quadrangulasi. Nurbs, Nurms, permukaan Subdiv harus dikonversi ke poligon. More info
    Lihat di Glossary
    Paket pro dengan versi 3.2 atau di atas.

  • Pass kedua membutuhkan:

  • Paket Render Pipeline definisi tinggi dengan versi antara 8.0 hingga 8.5

Shader "Examples/ExampleShader"
{
    SubShader
    {
        PackageRequirements
        {
            "com.my.package": "2.2"
        }
        Pass
        {
            PackageRequirements
            {
                "com.unity.render-pipelines.universal": "[10.2.1,11.0]"
                "com.unity.textmeshpro": "3.2"
            }
        }
        Pass
        {
            PackageRequirements
            {
                "com.unity.render-pipelines.high-definition": "[8.0,8.5]"
            }
        }
    }
}

Pemeriksaan kesalahan

Jika Anda menentukan persyaratan paket yang tidak pernah puas, proses impor warna gagal dengan kesalahan. Bagian ini memberikan contoh definisi persyaratan paket yang paling umum.

versi atau nama paket kosong

PackageRequirements {
  "com.some.package.x": "[10.2.1,9.0]"      // Error, empty version range
  "com.some.package.y": "[10.2.1.9,11.0]"       // Error, incorrect version format
  "com.some.package.z": "[2.3,3.5],[3.0,4.0]"               // Error, ranges intersect
  "" : "[2.3.4,3.4.5]"                  // Error, no package name provided
}

Beberapa ketergantungan pada paket yang sama

PackageRequirements {
  "com.some.package.x": "[10.2.1,11.0]"
  "com.some.package.x": "[11.2.1,12.0]" // Error, dependency on "com.some.package.x" declared twice
  "unity" : "2021.2"
  "unity" : "2021.3"    // Error, dependency on Unity version declared twice
}

Pernyataan ketergantungan

PackageRequirements {
  "com.some.package.x": "unity=[2021.2.1,2021.3.3]"
  "unity" : "2021.2"    // Error: Unity version requirement cannot be declared on a package and on its own simultaneously
}

Perincian ketergantungan antara SubShaders dan Passes

SubShader {
  PackageRequirements {
    "com.some.package.x": "[2.3.4,3.4.5]"
    "com.some.package.z": "[1.1,3.2]"
    "unity": "2021.2"
  }
  Pass {
    PackageRequirements {
      "com.some.package.y": "[1.2.2,2.5]"   // Fine, SubShader doesn’t declare a dependency on "com.some.package.y"
      "com.some.package.z": "[2.0,3.1]" // Fine, SubShader dependency intersects the provided version range
      "com.some.package.x": "[1.1.1, 2.2.2]"    // Error, SubShader version range for "com.some.package.x" does not intersect the provided range
      "com.some.package.w": "unity=[2021.2.1,2021.2.5]" // Fine, SubShader dependency intersects the provided version range
      "com.some.package.u": "unity=[2020.2.1,2020.2.5]" // Error, SubShader Unity version range does not intersect the provided range
    }
  }
}
ShaderLab: menambahkan program naungan
ShaderLab: perintah