Descrição geral primitiva do recorte – MRTK3
Os ClippingPrimitive
comportamentos permitem o recorte de formas , sphere
e box
performant plane
com a capacidade de especificar o lado do primitivo para recortar (dentro ou fora) quando utilizado com sombreados das Ferramentas Gráficas.
Nota
ClippingPrimitive
s utilize as instruções de recorte/eliminação 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.
O ClippingPlane.cs, o ClippingSphere.cs e o ClippingBox.cs podem ser utilizados para controlar facilmente o recorte de propriedades primitivas. Utilize estes componentes com os seguintes sombreados para utilizar cenários de recorte.
- Ferramentas Gráficas/Padrão
- Ferramentas Gráficas/Text Mesh Pro
- Ferramentas Gráficas/Wireframe
- Ferramentas Gráficas/Wireframe
- Ferramentas Gráficas/Não Tela/Backplate
- Ferramentas Gráficas/Não Tela/Frontplate
- Ferramentas Gráficas/Não Tela/Brilho
- Ferramentas Gráficas/Brilho Não Tela/Quad
- Ferramentas Gráficas/Não Tela/Biselada
Utilização avançada
Por predefinição, apenas um ClippingPrimitive
pode recortar um compositor de cada vez. Se o projeto precisar de mais do que um ClippingPrimitive
para influenciar um compositor , o código de exemplo abaixo demonstra como fazê-lo.
Nota
Ter vários ClippingPrimitive
clipes de um 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 s diferentes ClippingPrimitive
clip uma composição. Por exemplo, e ClippingSphere
ClippingBox
ao mesmo tempo:
// 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
Nota
A alteração acima irá incorrer em tempo de compilação de sombreado adicional.
Como ter dois dos mesmos ClippingPrimitive
clipes de uma composição. Por exemplo, dois ClippingBoxes
ao mesmo tempo:
// 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
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.