Partilhar via


Descrição geral primitiva do recorte – MRTK3

Os ClippingPrimitive comportamentos permitem o recorte de formas , spheree box performant planecom a capacidade de especificar o lado do primitivo para recortar (dentro ou fora) quando utilizado com sombreados das Ferramentas Gráficas.

Exemplo primitivo de recorte

Nota

ClippingPrimitives utilize as instruções de recorte/eliminação 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.

O ClippingPlane.cs, o ClippingSphere.cs e o ClippingBox.cs podem ser utilizados para controlar facilmente o recorte de propriedades primitivas. Utilize estes componentes com os seguintes sombreados para utilizar cenários de recorte.

  • Ferramentas Gráficas/Padrão
  • Ferramentas Gráficas/Text Mesh Pro
  • Ferramentas Gráficas/Wireframe
  • Ferramentas Gráficas/Wireframe
  • Ferramentas Gráficas/Não Tela/Backplate
  • Ferramentas Gráficas/Não Tela/Frontplate
  • Ferramentas Gráficas/Não Tela/Brilho
  • Ferramentas Gráficas/Brilho Não Tela/Quad
  • Ferramentas Gráficas/Não Tela/Biselada

Utilização avançada

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

Nota

Ter vários ClippingPrimitiveclipes de um 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 s diferentes ClippingPrimitiveclip uma composição. Por exemplo, e ClippingSphereClippingBox ao mesmo tempo:

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

Nota

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

Como ter dois dos mesmos ClippingPrimitiveclipes de uma composição. Por exemplo, dois ClippingBoxesao mesmo tempo:

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

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