[ Unity ] PostProcessing Error: NullReferenceException: Object reference not set to an instance of an object UnityEngine.Rendering.PostProcessing.AmbientOcclusion.IsEnabledAndSupported

Lutica_·2024년 12월 30일

경위

본 에러는 작동은 하나 에러 로그가 무한정 발생하는 현상에 대한 문제입니다.
필수적 해결 요소가 아니므로, 천천히 해결하시기 바랍니다.

  • AssetBundle에 있는 Scene에 PostProcessing Layer Component를 생성하였다.

  • 그러했더니, 아래 에러가 발생하였다.
    Invalid pass number (1) for Graphics.Blit (Material "(Unknown material)" with 1 passes)

  • Invalid pass number (1) for Graphics.Blit (Material "(Unknown material)" with 1 passes)

    본 에러는 Shader Error로서, PostProcessing의 Shader에 문제가 있음을 파악했다.
    지금보면, 사실 쉐이더를 지정하면 되는 문제가 아니었을까 싶기도 하다.

  • 일단, 문제 해결을 위해 검색을 시도하였고, 그 결과 아래의 답을 얻는다.

  1. AssetBundle의 Load가 끝나지 않은 상태에서 PostProcessing의 Culling이 시도되었다.
  2. 이로 말미암아, Shader의 Load가 끝나지 않아 발생한 문제이므로 지연된 로드 (Lazy Load)를 사용하여 이 문제를 지연시킴으로서 문제를 해결한다는 발상으로 접근하기로 한다.
  • 상세하게는, 아래의 방식이다.
	void Awake(){
       	camera.TryGetComponent<PostProcessLayer>(out var layer);
        if (layer != null){
            DestroyImmediate(layer);
        }
        var postProcessLayer = camera.gameObject.AddComponent<PostProcessLayer>();
        postProcessLayer.Init(null);
    }
  • 그랬더니, 아래의 문제가 발생하였다.

  • NullReferenceException: Object reference not set to an instance of an object UnityEngine.Rendering.PostProcessing.AmbientOcclusion.IsEnabledAndSupported (이하 스택)

  • 검색을 시도하였고, 결국 끝에 이 게시글을 발견한다.

  • 약술하자면, Start함수 안에 컴포넌트 초기화 함수를 넣고 만들면 된다는 뜻인데, 그렇게 해도 문제가 지속되서, 계속 소스코드 분석등의 시도를 해보았다.

  • 소스코드 분석을 시도한 결과, Resource가 비었음을 확인했으나, 스택의 맨 아래에서 PreCull이라는 구문을 확인하였고, 따라서 아래와 같이 변경하였다.

    void OnPostRender(){ // 이 콜백을 카메라가 붙어있어야 동작한다.
        if(_pl != null) return;
       	camera.TryGetComponent<PostProcessLayer>(out var layer);
        if (layer != null){
            DestroyImmediate(layer);
        }
        var postProcessLayer = camera.gameObject.AddComponent<PostProcessLayer>();
        postProcessLayer.Init(null);
        _pl = postProcessLayer;
    }
  • 잘 보면, AwakeOnPostRender로 변경되었다. 이는, 카메라가 렌더링 되고 나서 포스트 프로세싱을 추가하는 이벤트 트리거 역할을 한다.
  • 따라서, culling이 완료된 이후 PostProcessing을 진행하도록 하였다.
  • 그랬더니 문제없이 진행되었다. 다만 단 한번만 추가하는 기능에 대해서는 고민해 볼 필요가 있어보인다.
profile
해보고 싶고, 하고 싶은 걸 하는 사람

0개의 댓글