Kliping primitif — MRTK2
Perilaku memungkinkan ClippingPrimitive
pengklipan plane
bentuk , , sphere
dan box
berkinerja dengan kemampuan untuk menentukan sisi primitif mana yang akan diklip (di dalam atau di luar) saat digunakan dengan shader MRTK.
Catatan
ClippingPrimitives
gunakan instruksi klip/buang dalam shader dan nonaktifkan kemampuan Unity untuk membuat batch perender terklip. Pertimbangkan implikasi performa ini saat menggunakan kliping primitif.
ClippingPlane.cs
, ClippingSphere.cs
, dan ClippingBox.cs
dapat digunakan untuk dengan mudah mengontrol pengklipan properti primitif. Gunakan komponen-komponen ini dengan shader berikut untuk memanfaatkan skenario kliping.
- Mixed Reality Toolkit/Standard
- Mixed Reality Toolkit/TextMeshPro
- Mixed Reality Toolkit/Text3DShader
Contoh
Adegan ClippingExamples dan MaterialGallery menunjukkan penggunaan ClippingPrimitive
perilaku, dan dapat ditemukan di: MRTK/Examples/Demos/StandardShader/Scenes/
Penggunaan Tingkat Lanjut
Secara default hanya satu yang ClippingPrimitive
dapat mengklip perender pada satu waktu. Jika proyek Anda memerlukan lebih dari satu ClippingPrimitive
untuk memengaruhi perender , kode sampel di bawah ini menunjukkan cara mencapainya.
Catatan
Memiliki beberapa ClippingPrimitives
klip perender akan meningkatkan instruksi piksel shader dan akan berdampak pada performa. Harap profilkan perubahan ini dalam proyek Anda.
Cara memiliki dua klip render yang berbeda ClippingPrimitives
. Misalnya dan ClippingSphere
ClippingBox
pada saat yang sama:
// Within MRTK/Core/StandardAssets/Shaders/MixedRealityStandard.shader (or another MRTK shader) change:
#pragma multi_compile _ _CLIPPING_PLANE _CLIPPING_SPHERE _CLIPPING_BOX
// to:
#pragma multi_compile _ _CLIPPING_PLANE
#pragma multi_compile _ _CLIPPING_SPHERE
#pragma multi_compile _ _CLIPPING_BOX
Catatan
Perubahan di atas akan menimbulkan waktu kompilasi shader tambahan.
Cara memiliki dua klip yang sama ClippingPrimitives
yang dirender. Misalnya dua ClippingBoxes
pada saat yang sama:
// 1) Add the below MonoBehaviour to your project:
[ExecuteInEditMode]
public class SecondClippingBox : ClippingBox
{
/// <inheritdoc />
protected override string Keyword
{
get { return "_CLIPPING_BOX2"; }
}
/// <inheritdoc />
protected override string ClippingSideProperty
{
get { return "_ClipBoxSide2"; }
}
/// <inheritdoc />
protected override void Initialize()
{
base.Initialize();
clipBoxSizeID = Shader.PropertyToID("_ClipBoxSize2");
clipBoxInverseTransformID = Shader.PropertyToID("_ClipBoxInverseTransform2");
}
}
// 2) Within MRTK/Core/StandardAssets/Shaders/MixedRealityStandard.shader (or another MRTK shader) add the following multi_compile pragma:
#pragma multi_compile _ _CLIPPING_BOX2
// 3) In the same shader change:
#if defined(_CLIPPING_PLANE) || defined(_CLIPPING_SPHERE) || defined(_CLIPPING_BOX)
// to:
#if defined(_CLIPPING_PLANE) || defined(_CLIPPING_SPHERE) || defined(_CLIPPING_BOX) || defined(_CLIPPING_BOX2)
// 4) In the same shader add the following shader variables:
#if defined(_CLIPPING_BOX2)
fixed _ClipBoxSide2;
float4 _ClipBoxSize2;
float4x4 _ClipBoxInverseTransform2;
#endif
// 5) In the same shader change:
#if defined(_CLIPPING_BOX)
primitiveDistance = min(primitiveDistance, PointVsBox(i.worldPosition.xyz, _ClipBoxSize.xyz, _ClipBoxInverseTransform) * _ClipBoxSide);
#endif
// to:
#if defined(_CLIPPING_BOX)
primitiveDistance = min(primitiveDistance, PointVsBox(i.worldPosition.xyz, _ClipBoxSize.xyz, _ClipBoxInverseTransform) * _ClipBoxSide);
#endif
#if defined(_CLIPPING_BOX2)
primitiveDistance = min(primitiveDistance, PointVsBox(i.worldPosition.xyz, _ClipBoxSize2.xyz, _ClipBoxInverseTransform2) * _ClipBoxSide2);
#endif
Terakhir, tambahkan ClippingBox
komponen dan SecondClippingBox ke adegan Anda dan tentukan perender yang sama untuk kedua kotak. Perender sekarang harus diklip oleh kedua kotak secara bersamaan.