Vystřihování primitiv — MRTK2
Toto ClippingPrimitive
chování umožňuje provádět výřez plane
obrazců , sphere
a box
s možností určit, na které straně primitivu se má při použití s shadery MRTK ořízat (uvnitř nebo vně).
Poznámka
ClippingPrimitives
využít pokyny pro klip/zahození v rámci shaderů a zakázat schopnost Unity dávkově oříznuté vykreslovače. Při používání primitiv oříznutí mějte na paměti tyto dopady na výkon.
ClippingPlane.cs
, ClippingSphere.cs
a ClippingBox.cs
lze použít k snadnému řízení primitivních vlastností oříznutí. Tyto komponenty použijte s následujícími shadery k využití scénářů výřezu.
- Mixed Reality Toolkit/Standard
- Mixed Reality Toolkit/TextMeshPro
- Mixed Reality Toolkit/Text3DShader
Příklady
Scény ClippingExamples a MaterialGallery ukazují použití ClippingPrimitive
chování a lze je najít na adrese: MRTK/Examples/Demos/StandardShader/Scenes/
Rozšířené využití
Ve výchozím nastavení může vykreslovací modul vystřihování vykreslovat jenom jedenClippingPrimitive
. Pokud váš projekt vyžaduje k ovlivnění vykreslovacího modulu více než jedenClippingPrimitive
, ukázkový kód níže ukazuje, jak toho dosáhnout.
Poznámka
Pokud máte vykreslovací modul více ClippingPrimitives
klipů, zvýšíte počet pokynů pro pixel shader a ovlivníte výkon. Profilujte tyto změny v rámci projektu.
Jak vykreslit dva různé ClippingPrimitives
klipy. Například a ClippingSphere
ClippingBox
současně:
// 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
Poznámka
Výše uvedená změna způsobí další dobu kompilace shaderu.
Jak vykreslit dva stejné ClippingPrimitives
klipy. Například dvě ClippingBoxes
najednou:
// 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
Nakonec do scény přidejte komponentu ClippingBox
a SecondClippingBox a pro obě pole zadejte stejný renderer. Vykreslovací modul by teď měl být oříznutý oběma poli současně.