Visão geral da primitivo de recorte – MRTK3
Os comportamentos ClippingPrimitive
permitem o recorte de forma plane
, sphere
e box
de alto desempenho com a capacidade de especificar em qual lado do primitivo será recortado (dentro ou fora) quando usado com sombreadores de ferramentas gráficas.
Observação
ClippingPrimitive
s utilizam instruções de recorte/descarte dentro de sombreadores e desabilitam a capacidade do Unity de agrupar renderizadores recortados 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 do primitivo de recorte. Use esses componentes com os sombreadores a seguir para usar cenários de recorte.
- Ferramentas gráficas/Standard
- Ferramentas gráficas/Text Mesh Pro
- Ferramentas gráficas/Wireframe
- Ferramentas gráficas/Wireframe
- Ferramentas gráficas/não tela/placa traseira
- Ferramentas gráficas/não tela/placa frontal
- Ferramentas gráficas/não tela/brilho intenso
- Ferramentas gráficas/não tela/brilho intenso do Quad
- Ferramentas gráficas/não tela/bisel
Uso avançado
Por padrão, somente um ClippingPrimitive
pode recortar um renderizador por vez. Se o projeto exigir mais de um ClippingPrimitive
para influenciar um renderizador, o código de exemplo abaixo demonstrará como isso pode ser alcançado.
Observação
Fazer com que vários ClippingPrimitive
s recortem um renderizador aumentará as instruções do sombreador de pixels e afetará o desempenho. Crie o perfil dessas alterações no projeto.
Como fazer com que dois ClippingPrimitive
s diferentes recortem um renderizador. Por exemplo, um ClippingSphere
e um 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
Observação
A alteração acima incorrerá em tempo de compilação de sombreador adicional.
Como fazer com que dois dos mesmos ClippingPrimitive
s recortem um renderizador. Por exemplo, dois ClippingBoxes
s 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 componente ClippingBox
e SecondClippingBox
à cena e especifique o mesmo renderizador para ambas as caixas. O renderizador agora deve ser recortado por ambas as caixas simultaneamente.