이펙트아카데미 특강/외주/커뮤니티
언리얼 - HLSL 심층 설명 4_레이마칭 활용 평면정사각형 메시 3D 구체로 변형파트 1. VFX 기술 심층 요약
1. 영상 주제 및 학습 목표
- 주제는 Unreal Engine의 HLSL 셰이더를 활용한 광선 행진(Ray Marching) 기술로, 평면 정사각형 메시를 3D 구체로 변형 렌더링하는 것이다. 구현 목적은 메시 형태와 무관하게 구체의 정확한 형상과 조명을 적용하여 현실적인 VFX 효과를 내는 것으로, 이전 강의의 단순 UV 스케일링과 달리 3D 공간에서 시선 방향을 따라 반복 거리 샘플링하여 객체 내부를 탐지하고 Normal, Diffuse, Specular 조명을 계산한다. 학습 목표는 Ray Marching의 반복 루프를 통해 SDF(Signed Distance Function) 기반 거리 누적을 이해하고, 이를 Opacity Mask와 Normal 출력에 연결하여 셰이더가 구체를 인식하게 하며, 표준 조명 공식을 적용해 그림자/하이라이트를 구현하는 실무 역량을 습득하는 것이다.
2. 전체 제작 프로세스 상세 단계
- 단계 1: World Position에서 Object Pose를 빼 상대 좌표(Local Position)를 계산하여 구체 중심으로부터의 3D 벡터를 구함. 이는 세계 좌표계에서 객체의 상대 위치를 추출하여 구체 형상을 정의하는 기반이 됨.
- 단계 2: Local Position에서 구체 중심을 빼 length()로 거리를 계산하고 반지름을 빼 SDF(dist = length(p - c) - r) 생성. dist < 0이면 내부 점으로 판단하여 색상 출력, 이는 단일 샘플링으로 기본 형상을 테스트.
- 단계 3: 3D 시선 고려를 위해 View Direction을 -1 곱해 앞으로 진행 방향으로 변환 후, for 루프(n회 반복)에서 pos += viewDir step으로 위치 누적하며 dist를 샘플링. dist 누적과 Opacity Mask 적용으로 정사각형 외곽 제거하고 구체 내부만 남김.
- 단계 4: 히트 포인트에서 Normal = normalize(hitPos - center) 계산하여 표면 법선 생성. Tangent Space Normal 비활성화 후 Custom Normal 출력 연결로 셰이더가 구체 형상을 인식.
- 단계 5: Diffuse = max(0, dot(Normal, normalize(Light Direction)))으로 확산 반사 계산(음수 클리핑으로 뒷면 검정 처리). Reflect(L, N)으로 반사 벡터 R 생성 후 Specular = pow(max(0, dot(R, ViewDir)), sharp)로 하이라이트 적용, sharp 값으로 광점 선명도 제어.
- 단계 6: 최종 Emissive나 Base Color에 조명 결과 곱셈 출력, Atmosphere Light Direction 참조로 씬 조명 연동.
-------------------------
파트 2. 시간대별 주요 흐름 요약
- [00:00] 광선 행진(Ray Marching) 강의 시작, 이전 강의는 UV 스케일링으로 대체 가능했으나 이번에는 3D 정확한 이해 필요 설명.
- [00:25] 3강 내용을 1강에 압축해 길고 복잡함을 양해 구함, 시장에서 완전 설명 드문 기술이니 따라 해보라 조언.
- [00:45] 목표 효과 선프레임 데모: 정사각형 메시를 HLSL로 구체화하고 조명 적용, Wireframe상 동일하나 셰이더로 변형.
- [01:23] 구체 원리: 3D 두 점 거리 계산, World Position(XYZ 절대) - Object Position(상대 좌표계 위치) = Local Position(상대 3D 점).
- [03:42] HLSL 구현: return WorldPos - ObjectPose로 Local Pos 출력 테스트, Normal 시각화로 결과 확인.
- [04:28] SDF 도입: length(LocalPos - Center) - SphereRadius = dist, dist < 0 시 색상 곱셈 출력으로 내부 표시 테스트.
- [06:42] 3D 문제 발견: 단일 샘플링으로 부분만 계산되어 전체 구체 미형성, View Direction 고려 필요 설명.
- [07:08] Ray Marching 개념: 시선 추적체(녹색 콘)와 객체 교차 반복 샘플링 필요, 한 번 계산으로는 부족해 루프 도입.
- [08:35] 루프 구현: for(int i=0; i<n; i++) pos += -ViewDir step, dist 샘플링 누적, n=100으로 층층이 쌓임.
- [11:26] Opacity Mask 추가: 루프 내 누적 마스크로 내부만 남기고 외곽 제거, Float1 출력 연결로 정사각형 투명화.
- [13:05] Normal 출력: Custom 노드에 Auto Normal 추가 Float3 연결, Tangent Space Normal 끄고 셰이더 Normal 입력.
- [15:04] Normal 계산: normalize(LocalPos - Center), 구체 표면 법선으로 Diffuse = max(0, dot(N, LightDir)) 구현.
- [17:12] Specular: reflect(-LightDir, Normal)으로 R 계산, pow(max(0, dot(R, ViewDir)), sharp=16)으로 하이라이트, sharp로 크기 제어.
- [19:06] Ray Marching 비유: 구체를 n 슬라이스로 쪼개 시선이 통과하며 자르는 상상, n 증가로 정밀도 향상.
- [20:31] 강의 마무리: 다음 강의에서 이 기반으로 확장, Tangent Space Normal 기본 존재 강조.
-------------------------
파트 3. AI 기술 첨언 및 피드백
- 기술적 보완 제안: 루프 횟수 n을 동적 조정(예: dist < threshold 시 early exit)으로 성능 최적화, SDF를 여러 Primitive 합성(min/max)으로 복합 형상 지원, ViewDir 대신 정확한 Ray Origin + Dir 계산으로 왜곡 최소화, Temporal Reprojection으로 깜빡임 제거하고 Anti-Aliasing 적용.
- 학습 포인트 피드백: Ray Marching의 핵심은 SDF 거리 누적과 반복 스테핑으로 객체 내부 히트 감지 역량, Normal/조명 공식의 벡터 내적 인과관계(각도에 따른 밝기 변화) 집중 학습, HLSL Custom 노드 출력 관리(Opacity/Normal 별도 Float3/1 설정)가 실무 적용의 80% 성공 요인.
-------------------------
파트 4. 핵심 기술 용어 및 파라미터 사전
- 주요 기술 용어 해설
1. Ray Marching - 시선 방향(View Direction)을 따라 고정 스텝(step)으로 위치를 반복 누적하며 SDF 샘플링하는 기술. 영상에서 단일 계산의 부분 왜곡 문제를 해결하기 위해 for 루프 도입, n회 반복으로 시선 추적체가 객체를 층층이 통과하며 전체 형상/조명 계산 가능하게 함.
2. Signed Distance Function (SDF) - 점에서 객체 표면까지의 부호화 거리 함수(dist = length(p - c) - r). dist < 0 내부, > 0 외부 판단으로 Opacity Mask 생성, 구체 내부만 불투명 처리해 정사각형 메시를 가림.
3. Local Position - World Position - Object Pose로 계산된 상대 좌표. 객체 움직임에 따라 변형되는 빨간 좌표계 기준으로 구체 중심 정의, 3D 공간에서 메시 형태 무시한 독립 형상 생성 기반.
4. Opacity Mask - 루프 내 dist 누적 마스크로 내부 불투명도 제어. 루프 외부에서 출력 연결 시 정사각형 외곽 투명화, 구체 실루엣만 남겨 형상 완성.
5. Tangent Space Normal - 모델 폴리곤 기반 기본 법선. 비활성화 시 Custom Normal 적용으로 구체 독립 렌더링, 셰이더가 Wireframe Normal 무시하고 표면 법선 인식.
- 파라미터 수치 설정 이유
1. n=100 - 루프 반복 횟수로 슬라이스 층 수 결정. 적은 n(예:4)은 바깥층만 자라 왜곡 발생하나 100으로 증가 시 정밀한 구체 형상/조명 누적, Primitive 층 수 차감 후 실제 스텝 최적화로 성능과 품질 균형.
2. sharp=16 - Specular pow() 지수로 하이라이트 선명도 제어. power 증가 시 dot 값 급격 감소로 광점 축소(4→넓음, 16→작음, 24→더 작음), 수학적 포화 제한 고려해 16으로 현실적 반사광 크기 구현.
3. step (re-step) - ViewDir step 누적량, -ViewDir(무한 먼 카메라 방향 반전) 곱으로 앞으로 진행. 너무 크면 과도 점프 미스, 작으면 루프 과부하로 1/n 비례 설정해 안정적 히트 감지.
4. Sphere Radius - SDF dist 계산 기준, length(p-c)에서 빼 음수 내부 판단. 구체 크기 정의하며 메시 정사각형과 무관하게 형상 스케일링, 조명 Normal 영향으로 표면 곡률 강조.
-------------------------
에반 언리얼5 이펙트 그룹과정[26년초 시작] : https://cafe.naver.com/unrealfx/20727
KUPAFX Stylized 유니티 이펙트 취업과정 : https://cafe.naver.com/unrealfx/21249
트리키 언리얼+후디니 활용 게임 VFX 연출과정 : https://cafe.naver.com/unrealfx/25629
max님의 쌩기초 메쉬활용 이펙트과정 1달특강 : https://cafe.naver.com/unrealfx/24469
eVan텍스쳐 단품과정 : https://cafe.naver.com/unrealfx/24468
rak 유니티 UI연출이펙트 : https://gamefx.co.kr/bbs/page.php?hid=Rak_intro
RayMarching, UnrealEngine, HLSL, VFX, SphereRendering, NormalCalculation, DiffuseSpecular, SDF, OpacityMask, ShaderCustom