카툰 렌더링 메테리얼 연구 -4 (Outline)
Outline은 렌더링 되는 Depth와 관련이 깊다.
일단 Outline의 생성 원리는 먼저 해당하는 픽셀의 주변의 절대값(depth) 값들을 곱해서 그 값이 클때 아웃라인으로 판별하여 그려주는 것이다. 이를 Depth Edge Detection 을 한다고 말하는데.
이때 문제가 생기는 것이 비슷한 두 물체가 겹쳐있을 때 발생하는 문제이다.
그래서 Normal Edge Detection 이라는 걸 더해줘서 해당 경계에도 아웃 라인이 그려지도록 구현할 예정이다.
Depth Edge Detection + Normal Edge Detection = 아웃라인 설정 인 셈이다.
이걸 메테리얼로 표현해보자.
먼저 텍스쳐에서 포스트 프로세싱 메테리얼을 생성하고, material domain은 포스트프로세스로, blenderlocation은 before Tonemapping으로 설정해준다. ( 포스트프로세스 매핑하기 전에 적용한다는 얘기인거 같은데 정확하게 모르겠다 ㅠㅠ)
Depth Edge Detection을 구현할 메테리얼 function을 생성한다. 이 기능은 텍스처별로 Depth 를 계산하는 기능을 구현할 예정이다.
픽셀 단위를 정하기 위해, constant Vector2 를 생성하고 1로 만든다. ( 픽셀 1 기준) 1칸 1칸 해서 가로 세로 해야 하기 때문에 2개 생성해준다. 이건 로컬 기준값이니까 sceneTexelSize를 통해서 픽셀 단위를 1로 설정해준다.
이후에 기준이 되는 픽셀의 좌표를 기준으로, 왼쪽 오른쪽 값을 대입해준다.
이 2개의 값을 구한거고 vertical Offset을 또 만들어서 상, 하 를 구해줘야 한다.
이후에 이 값을 이용해서 Depth Edge dection 함수를 만들 차례이다.
다시 메테리얼 function을 만들고, 먼저 선의 두께를 constant 1 로 설정하고, 임계값 설정을 constant 4로 설정해 놓는다 (Outline 판별 기준값)
이후 방금 생성했던 텍스처들의 depth를 계산하는 material function을 가져와서 각각 scene Depth에 연결하고
Variation = Abs(Dleft+Dright+Dup+Ddown - 4 * Dcenter)
를 구현해준다.
이제 함수를 원래 postprocess 메테리얼에 연결해주면
외곽선이 나오게 된다.
이후 SceneTexture- postprocess의 Compoennt Mask 의 RGB 값을 lerp 하게 되면, 원래 색깔은 유지되고, depth 표시된 객체들은 Outline을 갖게 된다.
이것으로 Depth Edge Dection은 구현이 끝이다.
다음은 Normal Edge Detection 이다. 이것도 메테리얼 fucntion을 생성한다.
Depth Edge Dection와 비슷하지만 다른점은 SceneTexture: WorldNomal로 계산하는 것이다.
법선은 형상 표면에 수직인 벡터인데, 이 값을 설정해서 겹쳐있는 부분의 Outline까지 그려주는 것이다.
그래서 Depth 값을 더하는게 아닌, 법선의 길이를 토대로 하기때문에 Distance 값을 구해서 모두 더한 값이 Threshold(임계값) 1보다 크면 Outline으로 판별해주는 fuction이다.
이 값을 다시 lerp 해서 기존의 postprocess에 적용 시키면
이렇게 해서 Outline까지 설정이 가능하다. 두께 설정부터 색깔 설정까지 가능하다.
물론 이 메테리얼로 생기는 자잘한 문제들이 있기에 완벽하게 하려면 좀더 수정을 해야한다. 그건 다음 포스트에 진행할 예정이다.