Compartir a través de


Primitivo de recorte: MRTK2

Los ClippingPrimitive comportamientos permiten el recorte de formas , spherey box con planela capacidad de especificar en qué lado del primitivo se va a recortar (dentro o fuera) cuando se usa con sombreadores MRTK.

gizmos de recorte primitivo

Nota

ClippingPrimitives use instrucciones de recorte o descarte dentro de los sombreadores y deshabilite la capacidad de Unity para los representadores recortados por lotes. Tenga en cuenta estas implicaciones de rendimiento al usar primitivos de recorte.

ClippingPlane.cs, ClippingSphere.csy ClippingBox.cs se pueden usar para controlar fácilmente las propiedades primitivas de recorte. Use estos componentes con los siguientes sombreadores para aprovechar los escenarios de recorte.

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

Ejemplos

Las escenas ClippingExamples y MaterialGallery muestran el uso de los ClippingPrimitive comportamientos y se pueden encontrar en: MRTK/Examples/Demos/StandardShader/Scenes/

Uso avanzado

De forma predeterminada, solo se ClippingPrimitive puede recortar un representador a la vez. Si el proyecto requiere más de uno ClippingPrimitive para influir en un representador , el código de ejemplo siguiente muestra cómo lograrlo.

Nota

Tener varios ClippingPrimitives clips en un representador aumentará las instrucciones del sombreador de píxeles y afectará al rendimiento. Describa estos cambios dentro del proyecto.

Cómo tener dos clips diferentes ClippingPrimitives en una representación. Por ejemplo, y ClippingSphereClippingBox al mismo tiempo:

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

El cambio anterior supone un tiempo de compilación adicional del sombreador.

Cómo tener dos de los mismos ClippingPrimitives clips una representación. Por ejemplo, dos ClippingBoxes al mismo tiempo:

// 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 último, agregue un ClippingBox componente SecondClippingBox a la escena y especifique el mismo representador para ambos cuadros. El representador ahora debería recortarse mediante ambos cuadros simultáneamente.

Vea también