Primitivo de recorte – MRTK2
Os ClippingPrimitive
comportamentos permitem plane
o recorte de forma , sphere
e box
com desempenho com a capacidade de especificar em qual lado do primitivo será recortado (dentro ou fora) quando usado com sombreadores MRTK.
Observação
ClippingPrimitives
utilize instruções de clip/descarte em sombreadores e desabilite a capacidade do Unity de recortar renderizadores em lote. Tenha essas implicações de desempenho em mente ao utilizar primitivos de recorte.
ClippingPlane.cs
, ClippingSphere.cs
e ClippingBox.cs
podem ser usados para controlar facilmente as propriedades primitivas de recorte. Use esses componentes com os sombreadores a seguir para aproveitar cenários de recorte.
- Realidade Misturada Toolkit/Standard
- Realidade Misturada Toolkit/TextMeshPro
- Realidade Misturada Toolkit/Text3DShader
Exemplos
As cenas ClippingExamples e MaterialGallery demonstram o ClippingPrimitive
uso dos comportamentos e podem ser encontradas em: MRTK/Examples/Demos/StandardShader/Scenes/
Uso Avançado
Por padrão, apenas um ClippingPrimitive
pode cortar um renderizador por vez. Se o projeto exigir mais de um ClippingPrimitive
para influenciar um renderizador , o código de exemplo abaixo demonstra como fazer isso.
Observação
Ter vários clipes ClippingPrimitives
em um renderizador aumentará as instruções do sombreador de pixel e afetará o desempenho. Crie o perfil dessas alterações no projeto.
Como ter dois clipes diferentes ClippingPrimitives
em uma renderização. Por exemplo, um ClippingSphere
e ClippingBox
ao mesmo tempo:
// 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
Observação
A alteração acima incorrerá em tempo de compilação de sombreador adicional.
Como ter dois dos mesmos ClippingPrimitives
clipes em uma renderização. Por exemplo, dois ClippingBoxes
ao mesmo tempo:
// 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 fim, adicione um ClippingBox
componente e SecondClippingBox à cena e especifique o mesmo renderizador para ambas as caixas. O renderizador agora deve ser recortado por ambas as caixas simultaneamente.