VRChat 마이너 갤러리 저장소

제 목
강좌/팁 그래서 SDF가 뭐냐니까? 2편
글쓴이
MilkTank
추천
5
댓글
9
원본 글 주소
https://gall.dcinside.com/vr/4213424
  • 2024-10-03 13:50:58
 

1편에서 이어지는 글 입니다.


Le1rp는 E.RP가 금지어라 중간에 1을 넣었습니다.

1 빼고 봐주세요.




SDF 블렌딩:


또 다른 재미있는 방법은 두 SDF를 Linear Inte1rpolate 노드(줄여서 Le1rp)를 사용하여 블렌딩하는 것입니다.

이 노드는 각 SDF의 혼합 비율을 조정할 수 있게 해줍니다.

이를 통해 다음과 같은 결과를 얻을 수 있습니다.

원이 떨어지는 애니메이션이 정적인 원에 다양한 영향을 미치며, 0(정적인 원)과 1(떨어지는 원) 사이의 중간 값에서 조정하면 아름다운 눈물 방울 애니메이션을 만들 수 있습니다.



Le1rp 방식 외에도 SDF를 블렌딩하는 방법은 여러 가지가 있으며, 아마도 가장 수학적으로 유용한 방법은 아닐 것입니다.

IQ는 SDF를 혼합하기 위해 커스텀 부드러운 최소값(custom smooth minimum)을 사용합니다.

이 블렌드 기법을 구현하기 위해 커스텀 HLSL 노드를 만들었으며, 그 방법에 대해서는 나중에 설명할 것입니다.


여기서는 IQ가 사용한 수식을 보여주고 있습니다.

그는 비디오 게임 Dreams에서 영감을 받아 원래 코드를 개선하였으며, 그 게임에서 도형을 블렌딩하는 방식 중 하나였습니다.


79e5ef36eade21a861b2dfb41ae22932b50a8a28d4d872615475dc38c817f5483a3c


79e4ef2becdc0bab61b0c2bd58c12a3a28d0918b04c3f990938a35


이 글에서 나중에 커스텀 노드에 대해 좀 더 설명할 예정이니, 그 부분에 대해서는 걱정하지 마세요.

커스텀 SmoothMinimum의 결과는 Le1rp 블렌딩과는 상당히 다르지만, 블렌드는 정말 놀랍습니다.



IQ의 블렌드는 수학적으로 생성된 SDF 도형의 힘을 텍스처와 비교하여 보여줍니다.

이 두 거리 필드를 결합했을 때 생기는 고운 중간 영역은 텍스처만으로는 구현하기 매우 어렵습니다.

이 블렌드는 두 원이 서로 가까이 있을 때 거의 하나의 원으로 합쳐지며, 거리가 멀어질수록 다시 각각의 원으로 분리됩니다.

Le1rp와는 달리, Le1rp는 두 도형 중 어느 것이 더 지배적인지를 시각적으로 보여주는 가중치를 사용하는 반면,

이 블렌드는 실제로 두 도형이 가까울 때 합쳐지고 멀어질 때 분리됩니다.


블렌드의 양을 조절할 수도 있습니다.

위의 GIF에서 볼 수 있듯이, 조금만 블렌드를 사용하면 각 원이 뚜렷한 형태를 유지하고,

더 많은 블렌드를 사용하면 두 원이 하나의 큰 덩어리로 합쳐집니다.


큐빅 및 쿼드라틱 블렌드를 위한 다양한 공식도 있습니다.

제가 생각하기에 이 블렌드는 가장 간단하고 일반적인 결과를 비교적 저렴한 비용으로 얻을 수 있으므로, 여기서 데모를 보여주기로 했습니다.

하지만 다른 블렌드 방식도 살펴보고 시도해 보시면 좋겠습니다.


이제 원래의 스트로크를 다시 추가하고,

이 블렌드/결합/차집합/교집합을 사용하여 스트로크를 시간이 지남에 따라 성장시키면,

이러한 노드 몇 개의 조합만으로도 놀랍고 재미있는 애니메이션을 얻을 수 있습니다.







다시 말하지만, 이 애니메이션은 단 두 개의 원을 다양한 방식으로 블렌딩, 결합, 마스킹하여 만든 것입니다.

도형과 애니메이션의 조합은 거의 무한하며, 이는 단 두 개의 원에 불과합니다...

더 많은 도형을 추가하면 어떻게 될까요?

그럼 시작해봅시다!


SDF 도형 만들기

GLSL을 HLSL로 변환하기 - 커스텀 노드 사용


이제 커스텀 HLSL 노드를 훨씬 더 많이 사용할 때입니다.

제가 무슨 뜻인지 보여드리겠습니다.

원의 경우, 수학이 매우 간단했습니다:


78ebef25ecc03baa6b8cf29358c12a3aee1eb86ad8439ae5f409a3a4


하지만 더 많은 2D SDF 도형으로 들어가면 length(p) - r의 간단한 수식이 좀 더 복잡한 프로그래밍으로 바뀝니다.

예를 들어, 삼각형 모양을 만들고 싶다고 가정해 보겠습니다:


78eaef32f7db39a869b3d3fb06df231d0b96069edd004127c717a7


노드를 사용하여 모든 것을 재현할 수 있지만, 그렇게 하는 것은 추천하지 않습니다!

대신, 이 코드를 복사하여 Unity와 Unreal의 커스텀 HLSL 노드에 약간의 변환을 거쳐 붙여넣으면 복잡한 수학을 없앨 수 있습니다.

커스텀 SDF를 그래프에 가져오는 과정을 보여드리겠습니다.


첫 번째 단계는 텍스트를 어떤 종류의 메모장 편집기에 복사하는 것입니다:


78e5ef25eac221966facc2b458c12a3a53b2b516048dae1f3cc3e2


78e4ef28eac63db66fbbe4b006dd253e705772f39344e82f5db7e99ffeeac1


그 다음에는 GLSL로 작성된 모든 코드를 HLSL로 변환해야 합니다.

GLSL과 HLSL은 둘 다 셰이더 코딩 언어로 매우 유사합니다.

게임 엔진은 주로 HLSL을 사용하고, Shadertoy 및 일부 웹 애플리케이션은 GLSL을 사용합니다.

IQ의 도형은 GLSL로 작성되어 있으므로, Unity나 Unreal에서 사용하기 위해 HLSL로 변환해야 합니다.


GLSL을 HLSL로 변환하는 데 도움이 되는 유용한 사이트가 있는데, 변환 방법을 모르는 경우 여기서 확인할 수 있습니다.

예를 들어, vec2float2로 변경해야 하는 것을 볼 수 있습니다.


7bedef21e9c134b261b7daa61a9f3433540dadb6a5aa2e7801fb541f


GLSL 코드를 HLSL로 변환한 내용을 메모장에서 작성하여, 이를 게임 엔진에 쉽게 복사하고 붙여넣을 수 있도록 합니다.


7becef28eac63db66fbbe4b006dd253eb4454f05e9d10d5c1e275ae626393d


7befef20e9dd39b26db0d8a313c337341a5ed5c96b4faafa92ade5e2ddfe18d3


Unity를 사용할 경우, ReturnOut =로 변경하는 추가 작업을 수행합니다.


7beeef33ebdb2cbf40b0c2b006d020734dcbc2aea718b4a8befc3125b5


7be9ef33ebdb2cbf41aac2fb06df231de8b30ae3cae975b730


이제 Unity에서 커스텀 함수 노드를 만들거나 Unreal에서 커스텀 노드를 만들 수 있습니다.


7be8ef25f0c12ca96399c3bb15c52d326877963d2af7ee35afd32a3bf74f05


7bebef25f0c12ca963f1c6bb11f11a397d09709a9f5141


그런 다음 해당 코드를 적절한 섹션에 복사합니다.


7beaef35f1c031a869f1c6bb11f11a39976fc613612760c5


7be5ef25eac221af60abd3ad029f3433a2cee1fe07ecbed4ee0b726f


언리얼의 경우:


7be4ef33ebc03da7629cd9a50f9f3433ee356d8df6b108fe7fb08585


그런 다음 SDF 함수의 입력과 출력을 노드의 입력 및 출력에 맞춰야 합니다.

출력은 항상 float이어야 하며, 입력은 SDF마다 다를 수 있습니다.


7aedef28e4df31a869f1c6bb11f11a390ca890d13df2564272


7aecef33ebc03da7629cc3a602de2913a302ed5bb84a4e12ac863d813134a10903fe33


그런 다음 p에 UV 좌표를 연결해야 하며, 앞서 보여준 Constant Bias Scale을 사용해 올바른 좌표 공간에서 UV를 확인해야 합니다.

SDF를 만든 후에는 마지막에 Smoothstep 노드를 통과시켜 선명하게 하고, One Minus 노드를 사용해 색상을 반전시킵니다.

그러면 완벽한 삼각형 SDF가 생성됩니다!


7aefef33ebc03da7628bc4bc17df23312d5ebd5a42f8203c0df6f5a83bbb8cca


7aeeef32f7db39a869b3d38018d83024f7c41c0e8dfe5d01af2509dc727ce3


Unity의 Y 좌표가 Unreal과 반대로 뒤집혀 있기 때문에 삼각형의 방향이 다릅니다.

하지만 UV를 반전하거나 미러링하는 것은 쉽기 때문에 삼각형의 올바른 방향을 맞출 수 있습니다.

또한, 삼각형이 약간 크기 때문에 UV를 조정하여 SDF의 크기를 변경할 수 있습니다.

이 SDF 삼각형 코드는 크기 매개변수가 없기 때문입니다.



Multiply 또는 Divide를 사용하면 UV 좌표의 크기를 조정할 수 있으며, 이는 SDF의 크기를 키우거나 줄이는 데 영향을 줍니다.

예를 들어, 0.5로 곱하면 삼각형이 더 커지고, GIF 예제에서처럼 2로 곱하면 삼각형이 절반으로 줄어듭니다.

저는 0으로 나누는 오류를 피하기 위해 Divide보다 Multiply를 선호합니다.

컴퓨터는 0으로 나누는 것을 매우 싫어하기 때문입니다.

그래서 대부분의 UV 크기 조정 작업에서는 Multiply를 사용합니다.


Unity에서 삼각형을 반전시키려면, 벡터의 어떤 부분을 곱할지 더 쉽게 지정할 수 있습니다.


7ae8ef33ebdb2cbf5dbcd7b913e536348eb375eea24266880991a87da8ba126f702f7b3d


이 경우 Y를 -2로 곱하여 삼각형을 아래로 향하도록 반전시키고 크기를 반으로 줄였으며, X를 2로 곱하여 삼각형을 절반으로 줄였습니다.


마지막으로, 몇 가지 다른 도형을 만드는 몇 가지 커스텀 HLSL 노드 예시를 보여드리겠습니다.

이를 통해 다른 SDF를 변환하는 예를 확인할 수 있습니다:


7aebef33ebc03da7628dd9a018d52139ac6b15f57963b99e45ebde4251506d0947e318


7aeaef34eac736a26bbbe4b015c56a2d1c9092db95319a8bafc7721f02e5


7ae5ef33ebc03da7628dd9a018d521392c84259c48067f6460b060585d78d6cd48f38e


7ae4ef36e4c039aa62badab411c325303768ed3fda3d869ae9883a070d1461a7e5b7c88725


이제 여러 SDF를 결합하고, 스트로크를 추가하며, 모서리를 둥글게 만들고, 애니메이션을 적용하여 다양한 효과를 만들 수 있습니다.

SDF를 탐색하기 시작했을 때, 다양한 방법으로 애니메이션하고 결합함으로써 정말 멋진 결과를 얻을 수 있다는 사실에 놀랐습니다.


여기 제가 시간과 크기를 조정하여 실험해본 몇 가지 랜덤 Le1rp 애니메이션이 있습니다:




SDF의 무한한 옵션을 즐기세요!

다음에는 의사 랜덤으로 SDF 패턴, 시간, 및 파티클 시스템과 같은 애니메이션을 생성하는 방법에 대해 알아보겠습니다.



이것은 그다지 좋은 예시는 아니지만, 다른 생각이 떠오르지 않았습니다.







이렇게 끝이 났습니다.


사실 이번 글은 노드를 사용하는게 대부분이라 실 적용은 어렵지만, 이해하는데는 많은 도움이 될 것이라고 생각합니다.


저자는 다음에 의사 랜덤에 관한 글을 쓴다고 했는데, 다음글은 보이지 않네요.


여기서 마무리하고, 실험을 해본 뒤에 포이요미에서 적용하는 방법을 알아보겠습니다.


감사합니다.


이거진짜예요? 2024.10.03 13:56:29
소냐 앞글에 링크걸어야할듯 - dc App 2024.10.03 13:56:47
미만 고봉밥이라 읽기 귀찮아 요약해줘. - dc App 2024.10.03 13:57:34
ㅇㅇ 으...으에에... 2024.10.03 13:58:33
MilkTank 헤헤헤 2024.10.03 13:59:13
MilkTank 걸었어! 2024.10.03 13:59:18
MilkTank 성의없어서 요약하기 귀찮아 읽어줘. 2024.10.03 13:59:39
MilkTank ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 2024.10.03 13:59:43
미만 2024.10.03 14:00:10
번호 분류 제목 글쓴이 날짜 추천
4213725 일반 뭔닉네임이여 Takealook 2024-10-03 0
4213724 일반 부스 몇개 찾아보면 웃긴 샵들 많긴하네 1 ㅇㅇ 39.119 2024-10-03 0
4213723 일반 오늘 개씹뻘쭘했던거 ㅇㅇ 39.121 2024-10-03 0
4213722 일반 밥먹어야징 4 Desuwa 2024-10-03 0
4213721 일반 다른갤에 글쓰면 자꾸 닉넴가지고 뭐라함 1 보라지도댕이 2024-10-03 0
4213720 일반 초코에몽vs아사히슈퍼드라이 6 OwO 2024-10-03 0
4213719 일반 유동을쓸수밖에 2 ㅇㅇ 112.144 2024-10-03 0
4213718 일반 난 실제로 만나는애들도 나 닉넴으로 부름 6 나루미 2024-10-03 0
4213717 일반 인겜 닉네임은 특정 문장 줄임말이지만 갤닉은 ㅇㅇ이다 2 ㅇㅇ 2024-10-03 0
4213716 일반 알록달록 따까리있어도 이정돈 괜찮겠지? 소냐 2024-10-03 0
4213715 일반 왜 닉네임이 하나라고 생각하는거지 4 ㅇㅇ 2024-10-03 0
4213714 일반 전세계1억대팔린우주명차 보라지도댕이 2024-10-03 0
4213713 일반 퍼블릭에서 친구 사귀는법 강의좀 8 ㅇㅇ 2024-10-03 0
4213712 일반 심심하당 2 Desuwa 2024-10-03 0
4213711 일반 닉네임이 왜 두번째 이름이야? 17 나루미 2024-10-03 0
4213710 일반 오늘 난 최고의 인종차별주의자였음 5 くおん 2024-10-03 0
4213709 일반 나도 귀여움 받고싶음 5 캬루또너야? 2024-10-03 0
4213708 교류/번개 10월4일 오후20시 마작강의 4 Seileg 2024-10-03 0
4213707 일반 브붕이들 갤닉네임 뜻은 뭐야? 40 ㅇㅇ(223.235) 2024-10-03 0
4213706 일반 팔~각모 얼룩무늬~ 2 ㅇㅇ 2024-10-03 0
4213705 일반 잘거야 4 미만 2024-10-03 0
4213704 일반 장갑컨 주문하면 언제오지 5 소냐 2024-10-03 0
4213703 일반 샤워하고 브챗켜야지 OwO 2024-10-03 0
4213702 일반 술 마실 친구가 없군 4 ㅇㅇ 2024-10-03 0
4213701 일반 친구 두명 부계 파서 친추하길래 5 마후유 2024-10-03 0
4213700 일반 피코 살까 ㄹㅇ 2 ㅇㅇ 2024-10-03 0
4213699 일반 코난 최종 러브라인 뭔데 ㅋㅋㅋㅋㅋ 소냐 2024-10-03 0
4213698 일반 ㅅ언제쯤 이불속에서 쓰는 트래커가 나올까 7 생귤차 2024-10-03 0
4213697 일반 내 브쳇 닉네임은 음식이름+노래가서 에서 따왔어 ㅋㅋㅋㅋ 10 ㅇㅇ(223.235) 2024-10-03 0
4213696 일반 저년 암캐어필 하는 거 보고 피뽑아서 심장사상충 검사함 1 보라지도댕이 2024-10-03 0
4213695 일반 와 날씨 쌀쌀한게 담배피기 딱좋네 Akatsiya 2024-10-03 0
4213694 일반 일본인 친구개웃기네 ㅋㅋ 2 ㅇㅇ 106.72 2024-10-03 1
4213693 일반 닉네임은자신을대표하는두번째이름입니다 6 보라지도댕이 2024-10-03 0
4213692 일반 쓰담번개 주최하면서 딱한번 말함 5 소냐 2024-10-03 0
4213691 일반 브섹1스 후기 7 ㅇㅇ 39.121 2024-10-03 6
4213690 일반 핫초코 원탑 8 ㅇㅇ 2024-10-03 0
4213689 일반 으악 밖에 개추워 ㅁㅊ 6 냥캣77 2024-10-03 0
4213688 일반 귀여운닉 기준이머임 30 미찌 2024-10-03 0
4213687 일반 밥 천천히 먹기 왤케 어려움 8 스닉트 2024-10-03 0
4213686 일반 머그컵 하나 사둬야겟다 8 나루미 2024-10-03 0
념글 삭제글 갤러리 랭킹