Поделиться через


Примитив обрезки — MRTK2

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

примитивные отсеченные вещицы

Примечание

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

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

  • Смешанная реальность Toolkit/Standard
  • Набор средств Смешанная реальность/TextMeshPro
  • Смешанная реальность Toolkit/Text3DShader

Примеры

Сцены ClippingExamples и MaterialGallery демонстрируют использование ClippingPrimitive поведения. Их можно найти по адресу: MRTK/Examples/Demos/StandardShader/Scenes/

Расширенные возможности использования

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

Примечание

Наличие нескольких ClippingPrimitives клипов для отрисовщика увеличит инструкции шейдера пикселей и повлияет на производительность. Учтите эти изменения в своем проекте.

Как создать два разных ClippingPrimitives клипа для отрисовки. Например, ClippingSphere и ClippingBox одновременно:

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

Примечание

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

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

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

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

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