Compartilhar via


Primitivo de recorte – MRTK2

Os ClippingPrimitive comportamentos permitem planeo recorte de forma , spheree box com desempenho com a capacidade de especificar em qual lado do primitivo será recortado (dentro ou fora) quando usado com sombreadores MRTK.

gizmos de recorte primitivo

Observação

ClippingPrimitives utilize instruções de clip/descarte em sombreadores e desabilite a capacidade do Unity de recortar renderizadores em lote. Tenha essas implicações de desempenho em mente ao utilizar primitivos de recorte.

ClippingPlane.cs, ClippingSphere.cse ClippingBox.cs podem ser usados para controlar facilmente as propriedades primitivas de recorte. Use esses componentes com os sombreadores a seguir para aproveitar cenários de recorte.

  • Realidade Misturada Toolkit/Standard
  • Realidade Misturada Toolkit/TextMeshPro
  • Realidade Misturada Toolkit/Text3DShader

Exemplos

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

Uso Avançado

Por padrão, apenas um ClippingPrimitive pode cortar um renderizador por vez. Se o projeto exigir mais de um ClippingPrimitive para influenciar um renderizador , o código de exemplo abaixo demonstra como fazer isso.

Observação

Ter vários clipes ClippingPrimitives em um renderizador aumentará as instruções do sombreador de pixel e afetará o desempenho. Crie o perfil dessas alterações no projeto.

Como ter dois clipes diferentes ClippingPrimitives em uma renderizaçã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

Observação

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

Como ter dois dos mesmos ClippingPrimitives clipes em uma renderizaçã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 à cena e especifique o mesmo renderizador para ambas as caixas. O renderizador agora deve ser recortado por ambas as caixas simultaneamente.

Confira também