DOF를 표현 할 방법을 찾고 있습니다. 혹시나 가능할지 문의 드립니다.아래 스크린 샷의 숫자는 Sprite 로 Depth값을 사용하여 dof 를 표현한것 입니다.테스트 환경- Camera : Perspective - PostProcess : Depth of Field- Sprite : Unity Sprite Uber Shader
안녕하세요!
Depth of Field 기능은 Z 버퍼를 이용하기 때문에, 기본적으로는 불투명한(Opaque) 객체를 대상으로만 적용이 됩니다.
투명한(Transparent) 메시들은 Z 버퍼를 사용하지 않으며, 별개의 과정에서 렌더링이 되기 때문에 DOF의 대상이 되지 않습니다.
다만, AlphaTest 방식, 즉 불투명도가 일정값 이하인 경우를 잘라내는 방식의 쉐이더를 작성하시면 DOF의 대상에 넣을 수 있습니다.
저희가 문의 주신 Uber Shader를 설치하여 코드를 확인해보니 해당 방식을 사용하는 것을 확인하였습니다.
이 방식에는 분명한 한계점이 있는데, 일단 해결 방법을 먼저 설명하고 후술하겠습니다.
DOF를 적용하기 위해서는 커스텀 쉐이더를 작성해야합니다.
커스텀 쉐이더를 작성하고 적용하는 방법에 대해서는 아래의 메뉴얼을 읽어보실 것을 권장해드리며, 여기서는 커스텀 쉐이더를 어떻게 작성할지를 설명드리겠습니다.
- 커스텀 쉐이더 작성 방법 : https://rainyrizzle.github.io/kr/Script/SC_CustomShader.html
- 커스텀 쉐이더 적용 방법 : https://rainyrizzle.github.io/kr/AdvancedManual/AD_MeshShader.html
- 재질 라이브러리를 활용하는 방법 : https://rainyrizzle.github.io/kr/AdvancedManual/AD_MaterialLibrary.html
저희는 AnyPortrait의 기본 쉐이더를 아래와 같이 변경하였습니다.
(1) Properties에 [ _CutOff("CutOff", Range(0, 1)) = 0.5 ]를 추가합니다. 불투명도가 이 값 이하인 경우 그 부분은 렌더링되지 않습니다.
(2) Tags를 [ Tags{ "RenderType" = "TransparentCutout" "Queue" = "AlphaTest" "PreviewType" = "Plane" } ]으로 변경합니다.
그리고 [ ZWrite On ]을 추가합니다. 이제 이 메시가 렌더링 될때 Z 버퍼에 값이 저장됩니다.
(3) [ #pragma surface surf SimpleColor alpha ] 구문을 [ #pragma surface surf SimpleColor alphatest:_CutOff ] 구문으로 변경합니다.
이제 렌더링을 하면 위와 같이 DOF가 적용된 것을 볼 수 있습니다.
AlphaTest는 불투명한 메시의 렌더링 단계에 투명값이 있는 메시를 렌더링하는 방식으로서, 기본적으로는 불투명한 메시와 동일한 취급을 합니다.
그 특징 때문에 "반투명한 부분"을 렌더링할 수 없는 단점이 있습니다.
또한 오직 투명과 불투명한 값만 존재하므로 외곽선이 거칠게 되며, 일반적인 불투명 메시보다 DOF가 예쁘게 적용되기 힘든 단점도 있습니다.
(DOF의 품질은 설정을 조절하여 해결할 수 있을 것 같습니다.)
실제로, Uber Shader로 반투명한 부분이 있는 스프라이트 이미지를 렌더링해도 동일한 문제가 발생합니다.
저희가 유니티 포럼에서 이와 관련하여 검색해보니,
"투명한 메시에는 DOF를 적용하지 않는 것을 권장"하는 의견과 "2-Pass나 AlphaTest를 활용하여 어떻게든 렌더링을 시도"하는 의견들이 있음을 확인하였습니다.
이 점을 감안하시어, AnyPortrait로 제작하는 캐릭터가 반투명한 부분이 없다면 AlphaTest 방식을 시도해보시고,
그렇지 않다면 DOF 적용 여부를 고려해보시길 권장해드립니다.
감사합니다.
Eng)
Q. How to apply Depth of Field(DOF) to AnyPortrait
A. DOF can be applied by using shaders written in AlphaTest method. However, be aware of the limitations of AlphaTest.