Übersicht über Clipping-Grundtypen — MRTK3
Die ClippingPrimitive
-Verhaltensweisen ermöglichen ein leistungsfähiges plane
-, sphere
- und box
-Shape-Clipping mit der Möglichkeit festzulegen, an welcher Seite des Grundtyps geclippt werden soll (innen oder außen), wenn es mit Grafiktools-Shadern verwendet wird.
Hinweis
ClippingPrimitive
s verwenden Clip/Verwerfungs-Befehle in Shadern und deaktivieren die Fähigkeit von Unity, geclippte Renderer zu stapeln. Berücksichtigen Sie diese Leistungsauswirkungen beim Verwenden von Clipping-Grundtypen.
ClippingPlane.cs, ClippingSphere.cs und ClippingBox.cs können verwendet werden, um ClippingPlane.cs ganz einfach zu steuern. Verwenden Sie diese Komponenten mit den folgenden Shadern, um Clippingszenarien zu verwenden.
- Grafiktools/Standard
- Grafiktools/TextGitter Pro
- Grafiktools/Drahtmodell
- Grafiktools/Drahtmodell
- Grafiktools/Nicht-Canvas/Backplate
- Grafiktools/Nicht-Canvas/Frontplate
- Grafiktools/Nicht-Canvas/Glow
- Grafiktools/Nicht-Canvas/Quad Glow
- Grafiktools/Nicht-Canvas/Beveled
Erweiterte Verwendung
Standardmäßig kann nur ein ClippingPrimitive
Renderer einen Renderer zur gleichen Zeit ausschneiden. Wenn Ihr Projekt mehr als einen ClippingPrimitive
benötigt, um einen Renderer zu beeinflussen, zeigt der nachstehende Beispielcode, wie dies erreicht werden kann.
Hinweis
Wenn Sie einen Renderer mit mehreren ClippingPrimitive
s clippen, erhöht sich die Anzahl der Pixel-Shader-Anweisungen, was sich auf die Leistung auswirkt. Erstellen Sie in Ihrem Projekt ein Profil für diese Änderungen.
Wie man zwei verschiedene ClippingPrimitive
s in einem Rendering rendert. Zum Beispiel, ein ClippingSphere
und ClippingBox
gleichzeitig:
// 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
Hinweis
Die obige Änderung wird zusätzliche Zeit für die Shader-Kompilierung erfordern.
Wie man zwei gleiche ClippingPrimitive
s in einem Rendering ausschneidet. Zum Beispiel, zwei ClippingBoxes
gleichzeitig:
// 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
Fügen Sie schließlich Ihrer Szene eine ClippingBox
und SecondClippingBox
Komponente hinzu, und geben Sie denselben Renderer für beide Felder an. Der Renderer sollte nun gleichzeitig von beiden Feldern abgeschnitten werden.