Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Поведение ClippingPrimitive
позволяет выполнять обрезку plane
sphere
фигур , и 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 в сцену и укажите один и тот же отрисовщик для обоих полей. Теперь отрисовщик должен обрезаться обоими прямоугольниками одновременно.