Urklipp – MRTK2
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 MRTK-skuggor.
Anteckning
ClippingPrimitives
använd instruktioner för klipp/ignorera i skuggor och inaktivera 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 användas för att enkelt styra urklipps primitiva egenskaper. Använd dessa komponenter med följande skuggor för att utnyttja urklippsscenarier.
- Mixed Reality Toolkit/Standard
- Mixed Reality Toolkit/TextMeshPro
- Mixed Reality Toolkit/Text3DShader
Exempel
ClippingExamples- och MaterialGallery-scenerna visar hur ClippingPrimitive
beteendet används och finns på: MRTK/Examples/Demos/StandardShader/Scenes/
Avancerad användning
Som standard kan bara en ClippingPrimitive
klippa en renderare i taget. Om projektet kräver mer än en ClippingPrimitive
för att påverka en renderare visar exempelkoden nedan hur du kan uppnå detta.
Anteckning
Om en renderare har flera ClippingPrimitives
klipp ökar instruktionerna för pixelskuggning och prestandan påverkas. Profilera ändringarna i projektet.
Hur man har två olika ClippingPrimitives
klipp en återgivning. Till exempel en ClippingSphere
och ClippingBox
på samma gång:
// 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
Anteckning
Ovanstående ändring medför ytterligare kompileringstid för skuggning.
Så här har du två av samma ClippingPrimitives
klipp som en återgivning. Till exempel två ClippingBoxes
på samma gång:
// 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
Lägg slutligen till en ClippingBox
och SecondClippingBox-komponent i din scen och ange samma renderare för båda rutorna. Återgivningen bör nu klipps av båda rutorna samtidigt.