클리핑 기본 형식 - MRTK2
이 동작을 ClippingPrimitive
사용하면 MRTK 셰이더와 함께 사용할 때(내부 또는 외부)에 대해 클립할 기본 형식의 측면을 지정하는 기능을 사용하여 성능이 좋은 plane
, sphere
및 box
셰이프 클리핑을 수행할 수 있습니다.
참고
ClippingPrimitives
셰이더 내에서 클립/삭제 지침을 활용하고 잘린 렌더러를 일괄 처리하는 Unity의 기능을 사용하지 않도록 설정합니다. 클리핑 기본 형식을 사용할 때 이러한 성능 영향을 염두에 두세요.
ClippingPlane.cs
, ClippingSphere.cs
및 는 ClippingBox.cs
클리핑 기본 속성을 쉽게 제어하는 데 사용할 수 있습니다. 다음 셰이더와 함께 이러한 구성 요소를 사용하여 클리핑 시나리오를 활용합니다.
- Mixed Reality 도구 키트/표준
- Mixed Reality 도구 키트/TextMeshPro
- Mixed Reality 도구 키트/Text3DShader
예제
ClippingExamples 및 MaterialGallery 장면은 동작의 ClippingPrimitive
사용을 보여 줍니다. MRTK/Examples/Demos/StandardShader/Scenes/에서 찾을 수 있습니다.
고급 사용 방법
기본적으로 한 번에 하나의 ClippingPrimitive
렌더러 만 클립할 수 있습니다. 프로젝트에 렌더러에 영향을 주는 데 둘 ClippingPrimitive
이상이 필요한 경우 아래 샘플 코드는 이를 달성하는 방법을 보여 줍니다.
참고
렌더러에 여러 ClippingPrimitives
클립이 있으면 픽셀 셰이더 명령이 증가하고 성능에 영향을 줍니다. 이러한 변경 내용을 프로젝트 내에서 프로파일링하세요.
두 개의 서로 다른 ClippingPrimitives
클립을 렌더링하는 방법입니다. 예를 들어 및 ClippingSphere
ClippingBox
는 동시에 다음과 같습니다.
// 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
참고
위의 변경으로 인해 추가 셰이더 컴파일 시간이 발생합니다.
동일한 ClippingPrimitives
클립 중 두 개를 렌더링하는 방법입니다. 예를 들어 ClippingBoxes
두 가지를 동시에 수행합니다.
// 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
마지막으로 장면에 ClippingBox
및 SecondClippingBox 구성 요소를 추가하고 두 상자에 대해 동일한 렌더러를 지정합니다. 이제 렌더러를 두 상자에서 동시에 잘라 내야 합니다.