Общие сведения о примитивах обрезки — 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
укажите один и тот же отрисовщик для обоих прямоугольников. Теперь отрисовщик должен обрезаться обоими прямоугольниками одновременно.