Visão geral da primitivo de recorte – MRTK3

Os comportamentos ClippingPrimitive permitem o recorte de forma plane, sphere e box de alto desempenho com a capacidade de especificar em qual lado do primitivo será recortado (dentro ou fora) quando usado com sombreadores de ferramentas gráficas.

Exemplo primitivo de recorte

Observação

ClippingPrimitives utilizam instruções de recorte/descarte dentro de sombreadores e desabilitam a capacidade do Unity de agrupar renderizadores recortados em lote. Tenha essas implicações de desempenho em mente ao utilizar primitivos de recorte.

ClippingPlane.cs, ClippingSphere.cs e ClippingBox.cs podem ser usados para controlar facilmente as propriedades do primitivo de recorte. Use esses componentes com os sombreadores a seguir para usar cenários de recorte.

  • Ferramentas gráficas/Standard
  • Ferramentas gráficas/Text Mesh Pro
  • Ferramentas gráficas/Wireframe
  • Ferramentas gráficas/Wireframe
  • Ferramentas gráficas/não tela/placa traseira
  • Ferramentas gráficas/não tela/placa frontal
  • Ferramentas gráficas/não tela/brilho intenso
  • Ferramentas gráficas/não tela/brilho intenso do Quad
  • Ferramentas gráficas/não tela/bisel

Uso avançado

Por padrão, somente um ClippingPrimitive pode recortar um renderizador por vez. Se o projeto exigir mais de um ClippingPrimitive para influenciar um renderizador, o código de exemplo abaixo demonstrará como isso pode ser alcançado.

Observação

Fazer com que vários ClippingPrimitives recortem um renderizador aumentará as instruções do sombreador de pixels e afetará o desempenho. Crie o perfil dessas alterações no projeto.

Como fazer com que dois ClippingPrimitives diferentes recortem um renderizador. Por exemplo, um ClippingSphere e um ClippingBox 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

Observação

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

Como fazer com que dois dos mesmos ClippingPrimitives recortem um renderizador. Por exemplo, dois ClippingBoxess ao 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 componente ClippingBox e SecondClippingBox à cena e especifique o mesmo renderizador para ambas as caixas. O renderizador agora deve ser recortado por ambas as caixas simultaneamente.

Confira também