[Unity] 특정 모델에만 이미지 효과 적용

7979 단어 Unity

특정 모델에만 이미지 효과 적용


이미지 효과는 기본적으로 전체 화면에 적용되기 때문에 부분적으로 이미지 효과를 적용하려면 그 부분을 확인해야 한다.저기, 템플릿 버퍼의 출전 번호입니다.템플릿 버퍼의 값에 따라 효과 처리를 전환합니다.g의 느낌이라면 Unity로 이미지 효과를 구현한 경우 MonoBehaviour의 On RenderImage Graphics를 사용합니다.Blit을 사용하는 것이 기본이지만 템플릿 버퍼를 사용할 수 없기 때문에 CommandBuffer를 사용하는 방법을 소개합니다.

CommandBuffer 이미지 효과 사용


https://docs.unity3d.com/ja/current/Manual/GraphicsCommandBuffers.html
설명서에서 보듯이 CommandBuffer를 사용하면 도형 파이프라인에 여러 시기를 끼워 넣을 수 있습니다.Camera EventBeforeImageEffects를 사용하는 것이 좋습니다.(AfterImageEffects의 경우 위아래가 뒤바뀌고 템플릿 버퍼도 사용할 수 없습니다. AfterImageEffects와 AfterEvrything의 시기는 렌더링 목표에 대해 어떤 처리를 한 후인 것 같습니다.)
프로그램
1. CommandBuffer 만들기
2. 이미지 효과 재료와 함께 Blit 명령 설정하기
3. 카메라에 생성된 CommandBuffer 추가
네.On Enable을 사용하여 이 작업을 수행하여 카메라 객체에 첨부합니다.
구체적인 인코딩은 여기 있습니다.
ImageEffect.cs
using UnityEngine;
using UnityEngine.Rendering;

[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class ImageEffect : MonoBehaviour
{
    /// <summary>
    /// コマンドバッファ名
    /// </summary>
    private const string CommandBufferName = "StencilImageEffect";

    /// <summary>
    /// イメージエフェクトで使用するマテリアル
    /// </summary>
    [SerializeField] private Material material;

    /// <summary>
    /// イメージエフェクト用コマンドバッファ
    /// </summary>
    private CommandBuffer commandBuffer;


    private void OnEnable()
    {
        if (material == null) return;
        if (commandBuffer != null) return;

        var cam = GetComponent<Camera>();
        var cbs = cam.GetCommandBuffers(CameraEvent.BeforeImageEffects);
        foreach (var cb in cbs)
        {
            // 多重登録を回避するため、名前でチェック
            if (cb.name == CommandBufferName) return;
        }

        commandBuffer = new CommandBuffer();
        commandBuffer.name = CommandBufferName;

        // Blitでmaterialを適用してイメージエフェクトをかける
        commandBuffer.Blit(
            BuiltinRenderTextureType.CameraTarget,
            BuiltinRenderTextureType.CameraTarget,
            material);

        // カメラにコマンドバッファを登録
        cam.AddCommandBuffer(CameraEvent.BeforeImageEffects, commandBuffer);
    }

    private void OnDisable()
    {
        if (commandBuffer == null) return;

        var cam = GetComponent<Camera>();
        cam.RemoveCommandBuffer(CameraEvent.BeforeImageEffects, commandBuffer);
        commandBuffer = null;
    }
}

템플릿 버퍼 사용


템플릿 버퍼에 값 지정Value 쓰기
Stencil {
    Ref [_Value]
    Comp Always
    Pass Replace
}
템플릿 버퍼 값은Value에 대해서만 세션 모드를 실행할 경우
Stencil {
    Ref [_Value]
    Comp Equal
}
섀도우 선에 추가합니다.(자세한 내용은 참고 자료 참조
모델의 섀도우에서 템플릿 버퍼에 값을 쓰고, 이미지 효과의 섀도우에서 템플릿 버퍼 값을 참조하여 이미 쓴 값에서만 세션 모드를 실행합니다.

결실



반사 이미지 효과를 적용합니다.Cube 3개를 Unlit 마스크로 표시하고 가운데 Cube만 템플릿 버퍼에 씁니다.

총결산


Camera Event의 Before Image Effect 시간에 Blit을 진행하면 템플릿 버퍼를 참조하여 이미지 효과를 적용할 수 있습니다.이전 버전은 On RenderEmage에서도 비슷한 경험이 있습니다, Unity 2017.3.0f3는 안 되기 때문에 많이 조사한 결과 이 방법을 알게 되었다.On RenderEmage를 정의할 때는 천장 속 거리 측정 표적을 만드는 등 내부에서 다양한 조작이 이뤄지므로 CommandBuffer를 사용하는 것이 좋다.
2018/04/03
Blit의 RenderTarget은 플랫폼에 따라 변경해야 할 것 같습니다.Windows와 Mac에서는 Camera Target에서 Camera Target까지의 Blit가 순조롭게 진행되고 있지만, 안드로이드에서는 현재의 액티브부터 천장까지 Blit을 진행하지 않고, 천장부터 현재의 액티브까지 Blit를 할 때 소재를 설정하는 프로그램이 제대로 작동하지 않는다.

좋은 웹페이지 즐겨찾기