Ikhtisar primitif kliping — MRTK3

Perilaku memungkinkan ClippingPrimitive pengklipan planebentuk , , spheredan box berkinerja dengan kemampuan untuk menentukan sisi primitif mana yang akan diklip (di dalam atau di luar) saat digunakan dengan shader Alat Grafis.

Clipping primitive example

Catatan

ClippingPrimitives menggunakan 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 menggunakan skenario kliping.

  • Alat Grafis/Standar
  • Alat Grafis/Mesh Pro Teks
  • Alat Grafis/Bingkai Kawat
  • Alat Grafis/Bingkai Kawat
  • Alat Grafis/Non-Kanvas/Backplate
  • Alat Grafis/Non-Kanvas/Frontplate
  • Alat Grafis/Non-Kanvas/Bersinar
  • Alat Grafis/Non-Kanvas/Quad Glow
  • Alat Grafis/Non-Kanvas/Beveled

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 ClippingPrimitiveklip perender akan meningkatkan instruksi piksel shader dan akan berdampak pada performa. Buat profil perubahan ini dalam proyek Anda.

Cara memiliki dua klip render yang berbeda ClippingPrimitive. Misalnya, dan ClippingSphereClippingBox pada saat yang sama:

// Within GraphicsToolsStandard.shader (or another Graphics Tools shader that supports clipping primitives) change:

#pragma multi_compile_local _ _CLIPPING_PLANE _CLIPPING_SPHERE _CLIPPING_BOX

// to:

#pragma multi_compile_local _ _CLIPPING_PLANE
#pragma multi_compile_local _ _CLIPPING_SPHERE
#pragma multi_compile_local _ _CLIPPING_BOX

Catatan

Perubahan di atas akan menimbulkan waktu kompilasi shader tambahan.

Cara memiliki dua klip yang sama ClippingPrimitivedengan render. Misalnya dua ClippingBoxespada saat yang sama:

// 1) Add the below MonoBehaviour to your project:

using UnityEngine;
using Microsoft.MixedReality.GraphicsTools;

[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();

        clipBoxInverseTransformID = Shader.PropertyToID("_ClipBoxInverseTransform2");
    }
}


// 2) Within GraphicsToolsStandard.shader add the following multi_compile pragma:

#pragma multi_compile_local _ _CLIPPING_BOX2

// 3) In GraphicsToolsStandardInput.hlsl add the following shader variables:

#if defined(_CLIPPING_BOX2)
    half _ClipBoxSide2;
    float4x4 _ClipBoxInverseTransform2;
#endif

// 4) In GraphicsToolsStandardProgram.hlsl 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)

// 5) In the same shader change:

#if defined(_CLIPPING_BOX)
    primitiveDistance = min(primitiveDistance, GTPointVsBox(input.worldPosition.xyz, _ClipBoxInverseTransform) * _ClipBoxSide);
#endif

// to:

#if defined(_CLIPPING_BOX)
    primitiveDistance = min(primitiveDistance, GTPointVsBox(input.worldPosition.xyz, _ClipBoxInverseTransform) * _ClipBoxSide);
#endif
#if defined(_CLIPPING_BOX2)
    primitiveDistance = min(primitiveDistance, GTPointVsBox(input.worldPosition.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