Kliping primitif — MRTK2

Perilaku ClippingPrimitive memungkinkan kliping bentuk , , spheredan box performant planedengan kemampuan untuk menentukan sisi primitif mana yang akan diklip (di dalam atau di luar) ketika digunakan dengan shader MRTK.

primitive clipping gizmos

Catatan

ClippingPrimitives gunakan instruksi klip/buang dalam shader dan nonaktifkan kemampuan Unity untuk membuat batch perender terklip. Pertimbangkan implikasi performa ini saat menggunakan primitif kliping.

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 ClippingPrimitive yang 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 ClippingSphereClippingBox 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 dengan render. 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.

Lihat juga