석류 작업노트

언리얼엔진_카툰렌더링 아웃라인 표현식 (WorldPositionOffset/Twosidedsign/Fresnel) 본문

스터디/Unreal Engine

언리얼엔진_카툰렌더링 아웃라인 표현식 (WorldPositionOffset/Twosidedsign/Fresnel)

석류! 2024. 8. 30. 03:06

 
 
https://hanbyori.github.io/ToonShader/

카툰 렌더링

대상 그래픽스 이론을 어느정도 알고 있으면서 카툰 렌더링이 궁금한 독자를 대상으로 합니다.필자는 말하는 감자에 불과하기에 정말 많은 오류가 내포되어 있을 수 있습니다. 참고용으로만 가

hanbyori.github.io

 

이번에 쉐이더 자료 뜯어보다가
상당히 흥미롭고 재미있어 보이는 내용이 있어서 
직접 언리얼로 표현해 보려고 이렇게 가져왔다.
 
 
 

 
저 문서와 다른 자료들에 따르면
우리는 원본 메쉬를 설치하고
그 뒤에 똑같은 메쉬를 배치해 섭디,섭페의 bevel 처럼 겉부분을 바깥쪽 방향대로 살짝씩 돌출시켜
원본 메쉬 뒤에 배치해 아웃라인을 표현해 줄 것이다.
 
 

 
간단하게 설명하자면 다음과도 같다
생각해보면 어쩌면 ppt나 발표 , 포토샵 등등에서
우리가 자주 사용한 방식이
2D에서 3D로 사용되었을 뿐이다.
 
 
 

우리가 확인해 볼 노드는 다음과 같다.
 
여기서 가장 위 Color는 색 표현을위해 넣은것 뿐이라 무시해도되고
 
Twosided 로 바깥쪽을 구분해주고
Fresnel로 시야 각도를 이용해 중앙쪽에 불필요한 엣지들 지워주고
Position Offset 으로 각 버텍스들을 노말방향으로 Offset 시켜줘 아웃라인(두께)를 표현해준다
 
 
이걸 원리대로 순서대로해석을 진행해보겠다.
 

World Position Offset

먼저 World Position Offset 로 외곽선을 먼저 표현해줄것이다.
 
원본을 배치하고 거기에 모든 버텍스가 노말방향대로 돌출되어 
그 차이를 원본만큼 빼서 남는공간을 외곽선으로 표현해 줄 것이다.
그러기 위해선 모든 버텍스를 노말방향으로 돌출시킬 필요가 있다.
 

여기서 VertexNormalWS를 소환하여 버텍스노말방향을 뽑아내고
얼마나 도출시킬지 강도조절을 위한 1Vector와 Multiply 를 연결해
World Position Offset과 연결한다.
 

그럼 다음처럼 돌출되는 효과를 얻을 수 있다.
 
 
 
 
 
 
 

TwoSidedSign

이 노드는 면의 앞면과 뒷면을 구분하는 역할을 한다.
만약 보여지는 면이 앞면이면 1 로 표현하고
보여지는 면이 뒷면이라면 -1로 표현해준다.
 
 

 
앞면이 떴을때 파랑 , 뒷면이 떴을때 빨강 이라고 가정하고 노드를 짜면
다음과 같이 효과가 나오는것을 알 수 있다.
 
이를통해 아까와 같이 돌출되었을때 뒷면은 원본메쉬에 가려지고 앞면은 원본메쉬를 가려버리는데
여기서 앞면 부분을 통채로 날려버려 뒷면만 보이게 할 것이다.
 
 
 
 
다만 여기서 이대로 효과를 사용하기엔
메쉬가 복잡하다면 맥스에서 익스트루드를 심하게 줄 때처럼 이상하게 꼬일 때가 있다.
마찬가지로 여기에서도 그런 불순물들을 걸러내 줄 것이다.
 

위 이미지처럼 우리는 외곽선만 얻고 싶지만
중앙의 엣지디테일 때문에 원치않는 라인들이 떠있는 것을 볼 수 있다.
 
 
 
 
 
 

Fresnel

많이 사용하고 참고했던 영상에서도 참고했던 방식이다.
프레넬은 시야각에 따라 다른각도로 반사되는 현상을 의미한다.
이를통해 우린 카메라의 방향과 흡사한 노말을가진 벡터를 걸러내고
카메라와 수직으로 향하고 있는 라인들을 살려줄 것이다.
 

Camera Vector / Dot

다른 방식으로는
fresnel을 사용하진 않지만 카메라의 벡터(방향)과 
PixelNormalWS와의 Dot값을 구해 
위와같이 각도를 계산해 구별해준다.
 
 

Dither TemporalAA

Dither TemporalAA를 사용하는 방식도 있다.
이건.. 저번에 있던 팀에서 사용한 방식이지만...
뜯어봐도 정확히 왜 사용했는지 이해가되지않아서
정리가 되고 나면 수정해서 올릴예정
 

 
우측은 카메라벡터를 계산하지 않은값 / 좌측은 카메라벡터를 계산한 값이다.
여기서 완벽한 아웃라인을 계산할 것인지 , 툰쉐이더 처럼 값을 뽑아낼 것인지는
프로젝트에 따라 다를것이다.
 
 
 

툰쉐이더 효과를 위해 효과를 선택하여 사용한 모습
 
 
 
 
 
 
 
 

관련자료

https://mingyu0403.tistory.com/209

[Material] World Position Offset 알아보기

이 게시글은 움짤이 있습니다. 데이터가 많이 나갈 수도 있습니다. World Position Offset 이번엔 노드가 아니라 기본 노드에 있는 World Position Offset이 재밌어보여서 사용해보려고 한다. Mesh의 Vertex를

mingyu0403.tistory.com

 
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/coordinates-material-expressions-in-unreal-engine?application_version=5.3&utm_source=editor&utm_medium=docs&utm_campaign=rich_tooltips#vertexnormalws
 
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/constant-material-expressions-in-unreal-engine?application_version=5.3&utm_source=editor&utm_medium=docs&utm_campaign=rich_tooltips#twosidedsign
 
https://dev.epicgames.com/documentation/ko-kr/unreal-engine/math-material-expressions-in-unreal-engine?application_version=5.3&utm_source=editor&utm_medium=docs&utm_campaign=rich_tooltips#dotproduct
 
 
https://youtu.be/3MsepjqFZVw