Общие сведения о примитивах обрезки — MRTK3

При использовании с шейдерами Graphics Tools, поведение ClippingPrimitive позволяет выполнять производительную обрезку фигуры plane, sphere и box с возможностью указать, какая сторона примитива будет обрезана (внутри или снаружи).

Пример обрезки примитива

Примечание

ClippingPrimitive используют инструкции обрезки и отмены в шейдерах и отключает возможность пакетной обрезки и отрисовки Unity. Учитывайте эти последствия для производительности при использовании примитивов обрезки.

ClippingPlane.cs, ClippingSphere.cs и ClippingBox.cs можно использовать для легкого управления свойствами примитивов обрезки. Используйте эти компоненты со следующими шейдерами для использования сценариев обрезки.

  • Graphics Tools/Standard
  • Graphics Tools/Text Mesh Pro
  • Graphics Tools/Wireframe
  • Graphics Tools/Wireframe
  • Graphics Tools/Non-Canvas/Backplate
  • Graphics Tools/Non-Canvas/Frontplate
  • Graphics Tools/Non-Canvas/Glow
  • Graphics Tools/Non-Canvas/Quad Glow
  • Graphics Tools/Non-Canvas/Beveled

Расширенное использование

По умолчанию только один ClippingPrimitive может обрезать отрисовщик за раз. Если вашему проекту требуется более, чем один ClippingPrimitive, чтобы повлиять на отрисовщик, приведенный ниже пример кода, демонстрирует, как это можно сделать.

Примечание

Если для обрезки отрисовщика применяется более, чем один ClippingPrimitive, это увеличит количество инструкций для построителя текстуры и повлияет на производительность. Учтите эти изменения в своем проекте.

Как обрезать отрисовщик используя более, чем один ClippingPrimitive. Например, ClippingSphere и ClippingBox одновременно:

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

Примечание

Приведенное выше изменение увеличит время компиляции шейдера.

Как создать два экземпляра ClippingPrimitive для обрезки отрисовщика. Например, два ClippingBoxesодновременно:

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

Наконец, добавьте в сцену компоненты ClippingBox и SecondClippingBox укажите один и тот же отрисовщик для обоих прямоугольников. Теперь отрисовщик должен обрезаться обоими прямоугольниками одновременно.

См. также раздел