기본 머티리얼 설정과 적용
파티클용 머티리얼의 블렌드 모드·셰이딩 모델·Particle Color·텍스처를 설정해 기본 불꽃 표현을 완성합니다.
입자의 움직임을 아무리 정교하게 계산해도, 그 입자가 화면에 어떻게 보일지는 머티리얼(Material)이 크게 좌우합니다. 렌더러가 입자의 모양과 방향, 크기를 정하면, 머티리얼은 그 안의 픽셀 하나하나가 어떤 색과 투명도로 보일지를 정합니다. 둘이 함께 최종 모습을 만드는 셈입니다. 이 글에서는 파티클용 머티리얼의 블렌드 모드와 셰이딩 모델, 입자의 색을 읽는 Particle Color 노드, 텍스처를 설정하는 기본 원칙을 살펴보고, Additive 불꽃 머티리얼 M_SimpleFire를 직접 만들어 봅니다. 앞의 장에서 첫 입자의 머티리얼을 준비하러 온 경우에도 이 글의 실습을 그대로 따르면 됩니다.
머티리얼이 정하는 것
언리얼 엔진에서 머티리얼은 3D 물체나 입자의 표면이 빛에 어떻게 반응할지를 정하는 에셋입니다. 색(Base Color), 거칠기(Roughness), 금속성(Metallic), 노멀(Normal) 맵, 불투명도(Opacity) 같은 속성을 담고 있으며, 이것들이 모여 화면에 그려질 픽셀의 모습을 정합니다. 나이아가라의 입자는 대부분 2D 스프라이트로 그려지므로, 주로 텍스처 이미지와 투명도를 다루는 머티리얼을 씁니다.
렌더러에 머티리얼 지정하기
입자에 머티리얼을 적용하는 방법은 간단합니다. 나이아가라 에디터의 시스템 개요(System Overview)에서 이미터의 Render 그룹에 있는 렌더러, 흔히 Sprite Renderer를 선택합니다. 선택(Selection) 패널에서 Material 속성을 찾아 옆의 드롭다운이나 검색 버튼을 누르고, 쓸 머티리얼 에셋을 검색해 고릅니다. 머티리얼을 지정하면 바로 미리보기에서 입자의 모습이 바뀝니다.
파티클용 머티리얼의 기본 설정
블렌드 모드
블렌드 모드(Blend Mode)는 입자가 그 뒤의 배경과 어떻게 섞일지를 정하는 가장 중요한 설정입니다. 대부분의 입자 효과는 투명도를 쓰므로 다음 세 가지 가운데 하나를 고르게 됩니다. 블렌드 모드는 머티리얼 에디터의 Details 패널에서 Material 섹션의 Blend Mode로 정합니다.
Translucent(반투명)는 입자를 반투명하게 그려 뒤의 배경이 비쳐 보이게 합니다. 연기나 안개, 구름, 빛의 잔상처럼 부드러운 효과에 알맞고, 가장 자연스러운 투명도를 낼 수 있습니다. 대신 그리는 순서에 민감해서, 반투명한 물체가 여러 겹 겹치면 앞뒤가 뒤바뀌어 보이는 정렬 문제가 생길 수 있고, 같은 화소를 여러 번 칠하는 오버드로우(overdraw) 비용도 큽니다. 투명도 정보는 Opacity 핀에 연결하며, Opacity Mask는 Masked 모드에서 쓰는 입력입니다.
Additive(덧셈)는 입자의 색을 배경의 색에 더해서 그립니다. 그래서 검은색은 아무것도 더하지 않아 투명해 보이고, 밝은 색은 더 밝게 빛나 보입니다. 불꽃이나 스파크, 에너지 구슬, 레이저처럼 밝게 빛나는 효과에 주로 씁니다. 색을 더하기만 하므로 그리는 순서 문제가 거의 없고, 빛나는 느낌을 쉽게 낼 수 있습니다. 다만 넓은 면적이 겹치면 오버드로우 비용은 그대로 남으므로 Translucent보다 언제나 빠른 것은 아니며, 어두운 색이나 어두운 텍스처를 쓰면 효과가 잘 보이지 않습니다. 색은 Emissive Color 핀에 연결하는데, 아래에서 설명할 Unlit 셰이딩에서는 Base Color 입력을 쓰지 않기 때문입니다.
Masked(마스크)는 이미지의 알파를 기준으로 픽셀을 완전히 보이게 하거나 완전히 보이지 않게 합니다. 중간 단계의 반투명은 없습니다. 그리는 순서 문제가 없고 보이는 곳과 보이지 않는 곳이 분명해 성능 부담이 적지만, 부드러운 가장자리나 반투명은 표현할 수 없습니다. 투명도를 정할 그레이스케일 이미지나 계산 결과는 Opacity Mask 핀에 연결하고, Opacity Mask Clip Value로 보이고 보이지 않는 기준값을 조절합니다.
셰이딩 모델
대부분의 파티클 머티리얼은 셰이딩 모델(Shading Model)로 Unlit을 씁니다. Details 패널의 Material 섹션에서 Shading Model을 Unlit으로 두면, 표면에 비치는 직접 조명을 계산하지 않고 스스로 빛나는 것처럼 보이게 됩니다. 그렇다고 아무 영향도 받지 않는 것은 아니어서, 노출과 톤매핑, 안개의 영향은 받을 수 있습니다. 또 Emissive가 밝다고 해서 주변을 실제로 비추는 광원이 저절로 생기지도 않습니다. 주변을 비추려면 파티클과 조명 상호작용 기본 이해에서 다루는 Light Renderer 같은 방법이 따로 필요합니다.
Particle Color 노드
나이아가라에서 정한 입자의 색을 머티리얼에 반영하려면, 머티리얼 안에서 Particle Color 노드를 써야 합니다. 이 노드는 렌더러의 Color 바인딩이 넘겨준 RGB와 Alpha를 읽습니다. 기본 바인딩은 Particles.Color이며 다른 속성으로 바꿀 수도 있습니다. Particle Color는 값을 읽어 내보내는 노드이므로, 텍스처를 넣는 RGB나 Alpha 입력 핀은 없습니다.
머티리얼 그래프를 오른쪽 클릭해 Particle Color를 검색하면 노드를 추가할 수 있습니다. RGB 출력은 머티리얼의 Base Color나 Emissive Color 입력에, Alpha 출력은 Opacity나 Opacity Mask 입력에 연결합니다. 이렇게 연결해 두면 나이아가라에서 Initialize Particle이나 Scale Color로 바꾼 입자의 색이 이 노드를 거쳐 머티리얼에 반영되고, 최종 화면에 나타납니다.
텍스처
텍스처는 입자의 모양과 질감을 정하며, 보통 알파 채널이 있는 TGA나 PNG 같은 이미지를 씁니다. 텍스처의 알파가 제대로 들어왔는지는 세 가지로 확인합니다. 원본 파일에 알파 채널이 있는지, 텍스처 에디터에서 알파가 보이는지, 그리고 텍스처의 Compress Without Alpha가 꺼져 있는지입니다. 일반 컬러 텍스처는 알파를 지원하는 기본 압축 형식을 그대로 쓸 수 있습니다. 알파를 지키려고 용도가 다른 VectorDisplacementmap이나 압축하지 않는 UI용 형식으로 바꾸지 말고, 대상 플랫폼에서 실제로 쓰이는 포맷과 품질을 확인합니다.
간단한 불꽃 머티리얼 만들기
Additive 블렌드 모드를 쓰는 간단한 불꽃 머티리얼 M_SimpleFire를 만들어 봅니다. 1장이나 2장에서 첫 입자의 머티리얼을 준비하러 왔다면, 아래의 새 머티리얼 만들기부터 저장까지만 먼저 진행하면 됩니다. 이때 선택 사항인 텍스처는 건너뛰고 Particle Color의 RGB와 Alpha를 직접 연결합니다. 이미 M_SimpleFire가 있다면 그 에셋을 열어 설정과 연결만 확인합니다.
먼저 콘텐츠 브라우저를 오른쪽 클릭해 Material을 고르고, 이름을 M_SimpleFire로 정한 뒤 더블 클릭해 머티리얼 에디터를 엽니다. 메뉴에서 바로 보이지 않으면 오른쪽 클릭 메뉴의 검색창에 Material을 입력합니다. Details 패널의 Material 섹션에서 Blend Mode를 Additive로, Shading Model을 Unlit으로 바꿉니다.
다음으로 머티리얼 그래프를 오른쪽 클릭해 Particle Color를 추가하고, 그 RGB 출력을 Emissive Color 입력에, Alpha 출력을 Opacity 입력에 연결합니다. 여기까지 하고 저장하면 1장과 2장에서 쓸 기본 머티리얼이 완성됩니다.
텍스처로 불꽃의 모양을 다듬고 싶다면 이어서 진행합니다. 프로젝트에 있는 한 장짜리 불꽃이나 연기 텍스처를 그래프에 추가하는데, 예제 에셋의 이름과 설치 여부는 프로젝트마다 다릅니다. 스프라이트 시트라면 Sub Image Size와 Sub Image Index, UV 설정이 따로 필요합니다. 그다음 Texture Sample의 RGB와 Particle Color의 RGB를 Multiply로 곱해 Emissive Color에 연결하고, Texture Sample의 A와 Particle Color의 A를 다른 Multiply로 곱해 Opacity에 연결합니다. 앞에서 직접 연결했던 선은 이 두 Multiply의 출력으로 바꿉니다. 마지막으로 머티리얼을 저장합니다.
저장한 머티리얼은 첫 번째 나이아가라 이펙트의 NS_MyFirstEffect나 파티클 생성 및 기본 속성 설정의 NS_BasicSpawn을 열어 Sprite Renderer의 Material에 지정합니다. 첫 입자가 보이는지 확인하는 단계라면 텍스처 없이 시작하고, 불꽃 모양을 다듬는 작업은 나중에 이어 가도 됩니다. 나이아가라 에디터에서 Initialize Particle이나 Scale Color로 입자의 색을 주황색이나 노란색 계열로 바꾸고, 수명에 따라 알파를 낮춰 사라지게 하면 더 불꽃 같은 모습이 됩니다.
텍스처를 넣지 않은 스프라이트는 사각형 전체가 보일 수 있습니다. 밝은 배경과 어두운 배경에서 실루엣과 알파가 사라지는 모습을 비교해 보고, 화면에 보이는 밝기와 주변 조명에 주는 영향은 따로 확인합니다.
색과 알파는 따로 흐른다
NIAGARA · CH6-1
RGB와 Alpha를 서로 다른 입력에 곱해 전달합니다
본문의 Additive + Unlit, 단일 프레임 텍스처 예입니다. Texture Sample과 Particle Color는 출력을 읽는 노드이며 각 채널의 Multiply 결과가 머티리얼 입력에 들어갑니다.
색 경로 · RGB × RGB
텍스처 RGB와 Particle Color RGB를 곱해 Emissive Color에 연결합니다. Unlit의 Base Color 입력을 사용한 경로가 아닙니다.
알파 경로 · A × A
텍스처 Alpha와 Particle Color Alpha를 따로 곱해 Opacity에 연결합니다. RGB 곱셈만으로 알파까지 전달되지 않습니다.
읽는 속성 연결
Renderer Color Binding이 실제 기록한 Color를 읽는지 확인합니다. 흰 사각형이면 텍스처·알파 연결부터 확인합니다.
Masked는 Opacity Mask 입력을 사용합니다. 이 그림의 Additive Opacity는 덧셈 기여의 배율이며 검은색을 불투명하게 덮는 설정과 다릅니다.
Additive + Unlit 예제입니다. Particle Color와 Texture Sample은 읽는 출력 노드이며, Multiply 결과가 머티리얼 입력으로 들어갑니다.
위 그림은 이 글의 Additive와 Unlit, 한 장짜리 텍스처 예에서 색과 알파가 서로 다른 입력으로 흐르는 모습을 보여 줍니다. 위쪽의 색 경로에서는 텍스처의 RGB와 Particle Color의 RGB를 곱해 Emissive Color로 보내고, 이 값이 보이는 색과 발광을 정합니다. 아래쪽의 알파 경로에서는 텍스처의 Alpha와 Particle Color의 Alpha를 따로 곱해 Opacity로 보내며, Additive에서 이 값은 배경에 더해지는 양의 배율이 됩니다. Texture Sample과 Particle Color는 값을 읽어 내보내는 노드이고, 각 채널의 Multiply 결과가 머티리얼 입력으로 들어갑니다.
그림의 설명은 두 경로가 독립되어 있다는 점을 강조합니다. RGB에서 Alpha로 이어지는 실행 순서가 아니며, RGB를 곱하는 것만으로 알파까지 전달되지는 않습니다. 또 Unlit에서는 Base Color가 아니라 Emissive Color를 쓴다는 점, 흰 사각형만 보이면 텍스처와 알파 연결부터 확인하고 렌더러의 Color 바인딩이 실제로 쓴 색을 읽는지 보라는 점을 짚습니다. Masked라면 Opacity Mask 입력을 쓰며, 이 그림의 Additive Opacity는 더해지는 양의 배율이라 검은색을 불투명하게 덮는 설정과는 다릅니다.
숫자로 계산해 보면 두 경로의 차이가 분명해집니다. 텍스처의 한 표본이 RGB (0.8, 0.4, 0.1), Alpha 0.6이고, Particle Color가 RGB (1, 0.5, 0.2), Alpha 0.5라고 합시다. RGB를 성분마다 곱하면 Emissive Color의 입력은 (0.8 × 1, 0.4 × 0.5, 0.1 × 0.2) = (0.8, 0.2, 0.02)이고, 알파는 따로 곱해 0.6 × 0.5 = 0.3이 Opacity로 들어갑니다. 빨간 성분의 0.8이 Opacity에도 들어가는 것이 아닙니다. 이 값은 머티리얼의 입력이며, 노출과 톤매핑을 거친 뒤 화면 픽셀의 RGB를 잰 결과가 아닙니다.
정리
- 렌더러는 입자의 모양과 방향, 크기를 정하고,
Sprite Renderer의Material에 지정한 머티리얼은 픽셀의 색과 투명도를 정합니다. Translucent는 부드러운 반투명에,Additive는 빛나는 효과에,Masked는 가장자리가 뚜렷한 효과에 쓰며, 각각 쓰는 입력이Opacity나Opacity Mask로 다릅니다.- 대부분의 파티클 머티리얼은
Unlit을 쓰고 색을Emissive Color에 연결하며, Emissive가 밝아도 주변을 비추는 광원이 생기지는 않습니다. Particle Color는 렌더러의 Color 바인딩이 넘긴 RGB와 Alpha를 읽는 노드로, RGB와 Alpha를 각각 알맞은 입력에 연결합니다.- 텍스처와 입자 색을 함께 쓸 때는 RGB끼리, Alpha끼리 따로 곱해 각각
Emissive Color와Opacity에 연결합니다.
연습 문제
1. 알파만 0으로 바꾸면
다른 연결은 그대로 두고 Particle Color의 Alpha만 0으로 썼습니다. 본문의 예에서 Emissive Color 입력과 Additive에서 더해지는 양의 Opacity 배율은 각각 어떻게 될까요? 화면에서 보이지 않는다는 이유만으로 입자가 Kill되었거나 수명이 0이 되었다고 판단해도 될까요?
해설 보기
RGB 경로는 바뀌지 않았으므로 Emissive Color 입력은 여전히 (0.8, 0.2, 0.02)이고, Opacity는 0.6 × 0 = 0이 됩니다. 이 Additive 예에서는 더해지는 양이 알파 배율 0 때문에 사라져 화면에 보이지 않을 수 있습니다.
그렇다고 입자가 사라진 것은 아닙니다. 색을 쓰는 것만으로는 입자의 생존 상태나 Lifetime이 바뀌지 않으므로, 입자는 수명이 다할 때까지 살아 있고 그리는 비용도 듭니다. RGB와 Alpha를 모두 바꾸려면 각 출력 경로를 따로 연결해야 하며, Masked로 바꾼다면 Opacity Mask 입력이 따로 어떻게 동작하는지 확인합니다.
2. 흰 사각형만 보이는 불꽃
텍스처를 넣은 M_SimpleFire를 지정했는데, 불꽃 모양이 아니라 흰 사각형만 보입니다. 무엇부터 확인해야 할까요?
해설 보기
먼저 텍스처의 알파가 Opacity로 가는지 확인합니다. 텍스처의 A와 Particle Color의 A를 곱한 결과가 Opacity에 연결되어 있지 않다면, 사각형 전체가 같은 불투명도로 보입니다.
연결이 맞다면 텍스처 자체에 알파가 있는지, 텍스처 에디터에서 알파가 보이는지, Compress Without Alpha가 꺼져 있는지 확인합니다. 또 렌더러의 머티리얼이 정말 M_SimpleFire인지, 텍스처 대신 기본 머티리얼이 지정되어 있지 않은지도 봅니다.
3. 어두운 배경에서만 보이는 연기
연기 효과에 Additive 머티리얼을 썼더니, 어두운 밤 장면에서는 잘 보이는데 밝은 하늘 앞에서는 거의 보이지 않습니다. 왜 그럴까요? 어떤 블렌드 모드를 검토하면 좋을까요?
해설 보기
Additive는 입자의 색을 배경에 더하는 방식이라, 배경이 이미 밝으면 더해도 거의 차이가 나지 않습니다. 특히 회색 연기처럼 어두운 색은 밝은 배경에 더해도 잘 드러나지 않습니다.
연기처럼 배경을 가리며 반투명하게 보여야 하는 효과에는 Translucent를 검토합니다. Translucent는 배경과 입자의 색을 불투명도에 따라 섞으므로 밝은 배경 앞에서도 연기의 색이 보입니다. 대신 그리는 순서와 오버드로우 비용을 함께 확인합니다.
다음 글 커스텀 머티리얼과의 통합에서는 동적 머티리얼 파라미터로 나이아가라의 값을 머티리얼에 넘겨, 입자마다 다른 효과를 머티리얼에서 계산하는 방법을 살펴봅니다.