(2) Depth를 이용하기 위하여 "ZWrite Off"를 "ZWrite On"으로 변경합니다.
(3) vert 함수에 버텍스의 Z 위치를 변경하는 구문을 추가합니다. 외곽선이 캐릭터보다 뒤쪽에서 렌더링되도록 만듭니다. 변경되는 Z위치의 값에 따라서 외곽선이 렌더링되는 정도가 바뀝니다. 너무 작은 값으로 설정되면 캐릭터 내에서도 외곽선이 보여질 수 있고, 너무 큰 값이라면 캐릭터 사이에서 외곽선이 렌더링되지 않을 수 있습니다.
(4) 렌더링 방식이 "불투명(Opaque)"으로 변경되었기 때문에 투명한 부분은 "discard"를 호출하여 렌더링되지 않도록 만들어야 합니다.
쉐이더를 변경한 목적은, 렌더링되는 외곽선들 간에 "깊이(Z 위치)"를 비교하여 겹쳐지는 곳에서 렌더링이 되도록 만들기 위함입니다.
깊이를 인식하기 위해서는 렌더링 방식이 "불투명(Opaque)"이어야 하기 때문에 위와 같은 수정 작업이 필요합니다.
다시 게임으로 돌아오면 캐릭터와 캐릭터 사이에 외곽선이 그려지는 것을 볼 수 있습니다.
이 방식은 "깊이"를 이용했기 때문에 캐릭터들의 Z 위치가 위와 같이 어느정도 떨어져 있는 경우에만 예쁜 결과를 볼 수 있습니다.
이 내용은 URP에서의 외곽선 렌더링에 대한 메뉴얼에서도 다루고 있으니 같이 읽어보시면 참고가 될 것입니다.
Q. How to draw outlines in the built-in render pipeline
A. You can perform outline rendering using the command buffer. If you want to draw "outlines between characters", you can modify the shader slightly as shown above.
안녕하세요!
아웃라인, 즉 외곽선을 그려야 하는 경우, 캐릭터를 다음의 순서로 "두번" 렌더링해야합니다.
(1) 단색으로 조금 확장된 범위로 캐릭터를 렌더링합니다.
(2) 그 위에 본래의 이미지를 이용하여 캐릭터를 렌더링합니다.
위와 같이 두번 렌더링해야하는데, AnyPortrait의 경우 여러개의 메시들이 하나의 캐릭터를 구성하므로 조금 복잡한 방식으로 접근해야합니다.
이때 사용되는 기법이 "커맨드 버퍼 (Command Buffer)"입니다.
스크립트로 특수한 렌더링 요청을 입력하면 본래의 렌더링 외의 추가적인 렌더링을 할 수 있습니다.
AnyPortrait는 커맨드 버퍼를 사용하기 위한 스크립트 함수를 제공합니다.
다음의 메뉴얼에서 커맨드 버퍼를 이용하는 방법을 다루고 있습니다.
해당 메뉴얼의 "외곽선이 있는 캐릭터 렌더링하기" 항목에서 궁금해하시는 내용을 보실 수 있습니다.
(이 개념은 쉽지 않으므로, 해당 항목을 포함하여 전체적으로 메뉴얼을 읽어보실 것을 권장합니다.)
https://rainyrizzle.github.io/kr/AdvancedManual/AD_CommandBuffer.html
다만, 위 메뉴얼에서 안내하는 방법은 "캐릭터간에는 외곽선이 보여지지 않는 문제"가 있습니다.
"일괄적으로 외곽선 렌더링을 모두 진행한 후 캐릭터를 렌더링"하기 때문에, 캐릭터들이 겹쳐진 곳에서는 외곽선이 가려지지 때문입니다.
그것이 크게 문제가 되지 않는다면 다행이지만, 그렇지 않다면 다음의 설명이 도움이 될 것입니다.
다음의 설명은 위의 메뉴얼 중 "외곽선이 있는 캐릭터 렌더링하기" 항목에서 쉐이더 스크립트를 조금 수정하여 문제를 해결하는 방법을 다룹니다.
따라서, 아래의 설명을 읽기 전에 위의 메뉴얼을 먼저 읽고 시도해보시길 바랍니다.
(이미지가 작다면 클릭하거나 새 탭에서 열어서 크게 보실 수 있습니다.)
(1) 메뉴얼에서 안내하는 방식으로 렌더링을 한다면, 캐릭터들이 겹치는 곳에서는 외곽선이 렌더링되지 않습니다.
메뉴얼에서 안내하는 쉐이더 스크립트를 위와 같이 수정해봅시다.
붉은색 상자로 적힌 부분이 수정되거나 추가된 부분입니다.
(1) 렌더링 방식(RenderType)을 반투명(Transparent)에서 "불투명(Opaque)"으로 변경합니다.
(2) Depth를 이용하기 위하여 "ZWrite Off"를 "ZWrite On"으로 변경합니다.
(3) vert 함수에 버텍스의 Z 위치를 변경하는 구문을 추가합니다. 외곽선이 캐릭터보다 뒤쪽에서 렌더링되도록 만듭니다. 변경되는 Z위치의 값에 따라서 외곽선이 렌더링되는 정도가 바뀝니다. 너무 작은 값으로 설정되면 캐릭터 내에서도 외곽선이 보여질 수 있고, 너무 큰 값이라면 캐릭터 사이에서 외곽선이 렌더링되지 않을 수 있습니다.
(4) 렌더링 방식이 "불투명(Opaque)"으로 변경되었기 때문에 투명한 부분은 "discard"를 호출하여 렌더링되지 않도록 만들어야 합니다.
쉐이더를 변경한 목적은, 렌더링되는 외곽선들 간에 "깊이(Z 위치)"를 비교하여 겹쳐지는 곳에서 렌더링이 되도록 만들기 위함입니다.
깊이를 인식하기 위해서는 렌더링 방식이 "불투명(Opaque)"이어야 하기 때문에 위와 같은 수정 작업이 필요합니다.
다시 게임으로 돌아오면 캐릭터와 캐릭터 사이에 외곽선이 그려지는 것을 볼 수 있습니다.
이 방식은 "깊이"를 이용했기 때문에 캐릭터들의 Z 위치가 위와 같이 어느정도 떨어져 있는 경우에만 예쁜 결과를 볼 수 있습니다.
이 내용은 URP에서의 외곽선 렌더링에 대한 메뉴얼에서도 다루고 있으니 같이 읽어보시면 참고가 될 것입니다.
https://rainyrizzle.github.io/kr/AdvancedManual/AD_URPOutlineShader.html
문제가 해결되지 않거나 더 궁금한 점이 있다면 댓글을 남겨주세요!
감사합니다.
ENG)
Q. How to draw outlines in the built-in render pipeline
A. You can perform outline rendering using the command buffer. If you want to draw "outlines between characters", you can modify the shader slightly as shown above.