Partilhar via


Recorte primitivo — MRTK2

Os ClippingPrimitive comportamentos permitem o recorte de formas , spheree box performantplane, com a capacidade de especificar o lado do primitivo para recortar (dentro ou fora) quando utilizado com sombreados MRTK.

gizmos de recorte primitivo

Nota

ClippingPrimitives utilize instruções de recorte/eliminação de clipes dentro de sombreados e desative a capacidade do Unity de criar compositores recortados em lotes. Tenha estas implicações de desempenho em mente ao utilizar primitivos de recorte.

ClippingPlane.cs, ClippingSphere.cse ClippingBox.cs pode ser utilizado para controlar facilmente as propriedades primitivas do recorte. Utilize estes componentes com os seguintes sombreados para tirar partido dos cenários de recorte.

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

Exemplos

As cenas ClippingExamples e MaterialGallery demonstram a ClippingPrimitive utilização dos comportamentos e podem ser encontradas em: MRTK/Examples/Demos/StandardShader/Scenes/

Utilização Avançada

Por predefinição, apenas um ClippingPrimitive pode recortar um compositor de cada vez. Se o seu projeto precisar de mais do que um ClippingPrimitive para influenciar um compositor , o código de exemplo abaixo demonstra como o conseguir.

Nota

Ter vários clipes ClippingPrimitives num compositor aumentará as instruções do sombreador de píxeis e afetará o desempenho. Crie o perfil destas alterações no seu projeto.

Como ter dois clipes diferentes ClippingPrimitives numa composição. Por exemplo, um ClippingSphere e ClippingBox ao mesmo tempo:

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

Nota

A alteração acima irá incorrer em tempo de compilação de sombreado adicional.

Como ter dois dos mesmos ClippingPrimitives clipes de uma composição. Por exemplo, dois ClippingBoxes ao mesmo tempo:

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

Por fim, adicione um ClippingBox componente e SecondClippingBox à sua cena e especifique o mesmo compositor para ambas as caixas. O compositor deve agora ser recortado por ambas as caixas em simultâneo.

Ver também