Udostępnij za pośrednictwem


Fragmentowanie pierwotne — MRTK2

Zachowania ClippingPrimitive umożliwiają wykonywanie planewycinków , spherei box kształtów z możliwością określenia, która strona pierwotnego elementu pierwotnego do przycinania (wewnątrz lub na zewnątrz) jest używana z cieniowaniami mrTK.

pierwotne przycinanie gizmos

Uwaga

ClippingPrimitives korzystanie z instrukcji clip/odrzuć w cieniowaniach i wyłączanie możliwości aparatu Unity do wsadowego przycinania renderatorów. Weź pod uwagę te implikacje dotyczące wydajności podczas korzystania ze wycinków pierwotnych.

ClippingPlane.cs, ClippingSphere.csi ClippingBox.cs może służyć do łatwego kontrolowania przycinania właściwości pierwotnych. Użyj tych składników z następującymi cieniowaniami, aby wykorzystać scenariusze przycinania.

  • Mixed Reality Toolkit/Standard
  • Mixed Reality Toolkit/TextMeshPro
  • Mixed Reality Toolkit/Text3DShader

Przykłady

Sceny ClippingExamples i MaterialGallery przedstawiają użycie ClippingPrimitive zachowań i można je znaleźć na stronie: MRTK/Examples/Demos/StandardShader/Scenes/

Zaawansowane użycie

Domyślnie tylko jeden ClippingPrimitive może przycinać renderator w danym momencie. Jeśli projekt wymaga więcej niż jednego ClippingPrimitive wpływu na moduł renderowany przykładowy kod poniżej pokazuje, jak to osiągnąć.

Uwaga

Posiadanie wielu ClippingPrimitives klipów modułu renderującego zwiększy instrukcje cieniowania pikseli i wpłynie na wydajność. Zaproś te zmiany w projekcie.

Jak mieć dwa różne ClippingPrimitives klipy renderowane. Na przykład element i ClippingSphereClippingBox w tym samym czasie:

// 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

Uwaga

Powyższa zmiana spowoduje naliczanie dodatkowego czasu kompilacji cieniowania.

Jak mieć dwa z tego samego ClippingPrimitives klipu renderowany. Na przykład dwa ClippingBoxes w tym samym czasie:

// 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

Na koniec dodaj ClippingBox składnik SecondClippingBox do sceny i określ ten sam moduł renderujący dla obu pól. Moduł renderowania powinien być teraz przycięty przez oba pola jednocześnie.

Zobacz też