Sdílet prostřednictvím


Vystřihování primitiv — MRTK2

Toto ClippingPrimitive chování umožňuje provádět výřez planeobrazců , spherea box s možností určit, na které straně primitivu se má při použití s shadery MRTK ořízat (uvnitř nebo vně).

primitivní výstřižky

Poznámka

ClippingPrimitives využít pokyny pro klip/zahození v rámci shaderů a zakázat schopnost Unity dávkově oříznuté vykreslovače. Při používání primitiv oříznutí mějte na paměti tyto dopady na výkon.

ClippingPlane.cs, ClippingSphere.csa ClippingBox.cs lze použít k snadnému řízení primitivních vlastností oříznutí. Tyto komponenty použijte s následujícími shadery k využití scénářů výřezu.

  • Mixed Reality Toolkit/Standard
  • Mixed Reality Toolkit/TextMeshPro
  • Mixed Reality Toolkit/Text3DShader

Příklady

Scény ClippingExamples a MaterialGallery ukazují použití ClippingPrimitive chování a lze je najít na adrese: MRTK/Examples/Demos/StandardShader/Scenes/

Rozšířené využití

Ve výchozím nastavení může vykreslovací modul vystřihování vykreslovat jenom jedenClippingPrimitive. Pokud váš projekt vyžaduje k ovlivnění vykreslovacího modulu více než jedenClippingPrimitive, ukázkový kód níže ukazuje, jak toho dosáhnout.

Poznámka

Pokud máte vykreslovací modul více ClippingPrimitives klipů, zvýšíte počet pokynů pro pixel shader a ovlivníte výkon. Profilujte tyto změny v rámci projektu.

Jak vykreslit dva různé ClippingPrimitives klipy. Například a ClippingSphereClippingBox současně:

// 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

Poznámka

Výše uvedená změna způsobí další dobu kompilace shaderu.

Jak vykreslit dva stejné ClippingPrimitives klipy. Například dvě ClippingBoxes najednou:

// 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

Nakonec do scény přidejte komponentu ClippingBox a SecondClippingBox a pro obě pole zadejte stejný renderer. Vykreslovací modul by teď měl být oříznutý oběma poli současně.

Viz také