Översikt över urklipp – MRTK3
Beteendena ClippingPrimitive
möjliggör performant plane
, sphere
och box
formurklipp med möjlighet att ange vilken sida av primitiven som ska klippas mot (inuti eller utanför) när den används med Grafikverktyg-skuggor.
Anteckning
ClippingPrimitive
s använder instruktioner för klipp/ignorera i skuggor och inaktiverar Unitys möjlighet att batchklippta renderare. Tänk på de här prestandakonsekvenserna när du använder urklippsprimitiver.
ClippingPlane.cs, ClippingSphere.cs och ClippingBox.cs kan enkelt användas för att styra urklipps primitiva egenskaper. Använd dessa komponenter med följande skuggor för att använda urklippsscenarier.
- Grafikverktyg/Standard
- Grafikverktyg/Text mesh Pro
- Grafikverktyg/Wireframe
- Grafikverktyg/Wireframe
- Grafikverktyg/icke-arbetsyte-/backplate
- Grafikverktyg/icke-arbetsyte-/frontplate
- Grafikverktyg/icke-arbetsyte-/ljussken
- Grafikverktyg/icke-arbetsyte-/quad-ljussken
- Grafikverktyg/ej arbetsytor/fasade
Avancerad användning
Som standard kan bara en ClippingPrimitive
klippa ut en renderare i taget. Om projektet kräver mer än en ClippingPrimitive
för att påverka en renderare visar exempelkoden nedan hur detta kan uppnås.
Anteckning
Om du har flera ClippingPrimitive
klipper en renderare ökar pixelskuggningsinstruktionerna och prestandan påverkas. Profilera ändringarna i projektet.
Hur man har två olika ClippingPrimitive
s klipp en återgivning. Till exempel en ClippingSphere
och ClippingBox
på samma gång:
// 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
Anteckning
Ovanstående ändring medför ytterligare kompileringstid för skuggning.
Hur man har två av samma ClippingPrimitive
klipp en återgivning. Till exempel två ClippingBoxes
på samma gång:
// 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
Lägg slutligen till en komponent och SecondClippingBox
en ClippingBox
komponent i scenen och ange samma renderare för båda rutorna. Återgivningen bör nu klipps av båda rutorna samtidigt.