Recorte primitivo — MRTK2
Os ClippingPrimitive
comportamentos permitem o recorte de formas , sphere
e box
performantplane
, com a capacidade de especificar o lado do primitivo para recortar (dentro ou fora) quando utilizado com sombreados MRTK.
Nota
ClippingPrimitives
utilize instruções de recorte/eliminação de clipes dentro de sombreados e desative a capacidade do Unity de criar compositores recortados em lotes. Tenha estas implicações de desempenho em mente ao utilizar primitivos de recorte.
ClippingPlane.cs
, ClippingSphere.cs
e ClippingBox.cs
pode ser utilizado para controlar facilmente as propriedades primitivas do recorte. Utilize estes componentes com os seguintes sombreados para tirar partido dos cenários de recorte.
- Mixed Reality Toolkit/Standard
- Mixed Reality Toolkit/TextMeshPro
- Mixed Reality Toolkit/Text3DShader
Exemplos
As cenas ClippingExamples e MaterialGallery demonstram a ClippingPrimitive
utilização dos comportamentos e podem ser encontradas em: MRTK/Examples/Demos/StandardShader/Scenes/
Utilização Avançada
Por predefinição, apenas um ClippingPrimitive
pode recortar um compositor de cada vez. Se o seu projeto precisar de mais do que um ClippingPrimitive
para influenciar um compositor , o código de exemplo abaixo demonstra como o conseguir.
Nota
Ter vários clipes ClippingPrimitives
num compositor aumentará as instruções do sombreador de píxeis e afetará o desempenho. Crie o perfil destas alterações no seu projeto.
Como ter dois clipes diferentes ClippingPrimitives
numa composiçã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
Nota
A alteração acima irá incorrer em tempo de compilação de sombreado adicional.
Como ter dois dos mesmos ClippingPrimitives
clipes de uma composiçã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 à sua cena e especifique o mesmo compositor para ambas as caixas. O compositor deve agora ser recortado por ambas as caixas em simultâneo.