러프니스 맵과 메탈릭 맵을 sRGB로 불러왔다가 재질이 이상하게 매끈해진 경험, 한 번쯤 있으실 텐데요. 결론부터 말하면 이 두 맵은 반드시 Raw(리니어) 색공간으로 불러와야 합니다. 왜 그런지 차근차근 살펴보겠습니다.
러프니스는 “보이는 밝기”가 아니라 셰이더의 숫자입니다
우리는 흔히 텍스처 맵을 볼 때 “이 부분이 밝네, 어둡네” 하고 눈으로 판단하는 습관이 있습니다. 컬러 텍스처(디퓨즈, 알베도)는 실제로 사람 눈에 자연스럽게 보이도록 만들어진 이미지라서 그 습관이 맞습니다. 하지만 러프니스 맵과 메탈릭 맵은 전혀 다른 종류의 데이터입니다.
이 맵들은 “그림”이 아니라 셰이더에 들어가는 파라미터 값입니다. 픽셀 하나하나가 “이 지점은 얼마나 거칠다(러프니스 0.7)”, “이 지점은 금속이다(메탈릭 1.0)”라는 숫자를 담고 있을 뿐이에요. 비유하자면 온도계 눈금 같은 겁니다. 37도라는 숫자를 예쁘게 보이려고 색 보정을 하면 안 되는 것처럼, 러프니스 0.5라는 값도 화면에 예쁘게 보이라고 감마를 씌우면 안 됩니다. 사람이 보기 좋으라고 만든 규칙(감마 보정)을 컴퓨터가 계산에 쓸 숫자에 적용하는 순간, 그 숫자 자체가 바뀌어 버리는 것이 문제의 핵심입니다.
sRGB로 불러오면 실제로 무슨 일이 벌어질까 🔍
감마란 쉽게 말해 사람 눈이 어두운 쪽 밝기 차이에 더 민감하다는 특성을 보정해주기 위해 이미지 값을 살짝 왜곡해서 저장하는 규칙입니다. 모니터에 표시될 때는 다시 원래대로 풀어주는데, 이 “풀어주는” 과정을 감마 디코딩이라고 부릅니다.
문제는 러프니스 맵을 sRGB로 지정하면, 소프트웨어가 “이건 사람이 보는 이미지구나”라고 착각해서 자동으로 감마 디코딩을 걸어버린다는 점입니다. 텍스처 파일 안에는 0.5라는 값이 저장되어 있어도, 셰이더에 실제로 전달되는 값은 감마 2.2 기준으로 다음과 같이 계산됩니다.
0.5 ^ 2.2 ≈ 0.218
즉 화가나 텍스처 아티스트는 “적당히 거친 정도”로 0.5를 그려 넣었는데, 렌더러는 그 절반도 안 되는 0.218을 받아서 계산하게 되는 것이죠. 러프니스 값이 낮아지면 표면은 더 매끈해지고, 하이라이트는 더 좁고 강하게 뭉칩니다. 결과적으로 아무리 러프니스 맵을 정성껏 그려도 렌더링에서는 플라스틱처럼 번들거리는 재질이 나오게 됩니다. 반대로 러프니스가 높은 영역(예: 0.9)은 0.9^2.2 ≈ 0.794 정도로, 상대적으로 왜곡 폭이 작다는 점도 함께 기억해두면 좋습니다. 즉 중간 톤에서 왜곡이 가장 크게 체감됩니다.
메탈릭 맵은 사실상 0/1 마스크에 가깝습니다
메탈릭 맵은 러프니스보다 더 극단적인 경우입니다. 실무에서 메탈릭 값은 대부분 완전한 금속(1.0)이거나 완전한 비금속(0.0)으로 나뉘고, 그 사이의 중간값은 가장자리 안티앨리어싱이나 특수한 혼합 재질 정도에만 아주 좁게 쓰입니다. 사실상 켜짐/꺼짐을 나타내는 마스크에 가깝다는 뜻이죠.
그런데 sRGB 감마가 걸리면 문제는 두 가지입니다.
- 0과 1 근처의 값은 감마를 씌워도 거의 그대로 유지되지만, 경계선 주변의 중간값(0.3~0.7 구간)이 크게 뒤틀립니다.
- 안티앨리어싱된 경계 픽셀들이 원래 의도보다 훨씬 더 “비금속 쪽”으로 쏠리면서, 금속과 비금속의 경계가 지저분하게 번지거나 얇은 금속 테두리가 사라지는 현상이 생깁니다.
메탈릭은 이분법적인 재질 판정에 가깝기 때문에, 이 판정 기준이 흔들리면 눈에 확 띄는 시각적 오류로 이어지기 쉽습니다.
GGX 마이크로패싯 모델과 제곱 연산, 작은 오차가 크게 보이는 이유
요즘 대부분의 렌더러가 쓰는 GGX(혹은 이와 유사한 마이크로패싯 기반) 스페큘러 모델에서는, 러프니스 값이 그대로 쓰이지 않고 내부적으로 제곱이나 그 이상의 지수로 변환되어 사용되는 경우가 많습니다. (정확한 변환 방식은 렌더러와 셰이더 구현마다 조금씩 다르므로 여기서는 일반적인 경향만 짚어두겠습니다.)
이 말은 러프니스 입력값에 생긴 작은 오차가, 실제 하이라이트의 모양이나 크기에는 훨씬 크게 증폭되어 나타날 수 있다는 뜻입니다. 안 그래도 감마 디코딩 때문에 값 자체가 크게 틀어지는데(0.5 → 0.218), 여기에 제곱 연산까지 더해지면 눈으로 보는 결과물의 차이는 생각보다 훨씬 두드러지게 됩니다. 결과적으로 “이유는 모르겠는데 재질이 계속 반짝거린다”는 문제의 상당수가 바로 이 색공간 설정 실수에서 비롯됩니다.
같은 논리가 적용되는 다른 데이터 맵들
러프니스와 메탈릭만의 문제가 아닙니다. “사람이 감상하는 그림”이 아니라 “셰이더나 지오메트리 연산에 쓰이는 숫자”를 담은 맵은 전부 같은 원칙을 따라야 합니다.
- AO(앰비언트 오클루전) 맵: 구석진 곳이 얼마나 가려지는지를 나타내는 0~1 계수입니다. 감마가 걸리면 그림자 강도가 실제보다 세지거나 약해집니다.
- 디스플레이스먼트/하이트 맵: 픽셀 값이 곧 표면의 높이(변위량)입니다. 감마 왜곡이 생기면 지오메트리 형태 자체가 틀어집니다.
- 오파시티/알파 마스크: 투명도를 나타내는 숫자입니다. 경계가 뭉개지거나 반투명 영역의 비율이 달라집니다.
- 일반 마스크 텍스처: 특정 영역을 선택하기 위한 흑백 스텐실입니다. 역시 값 자체가 의미를 가지므로 왜곡되면 선택 영역이 어긋납니다.
정리하면 “사람 눈에 예쁘게 보이라고 만든 이미지”만 sRGB이고, 그 외 “연산에 쓰이는 숫자 지도”는 전부 Raw(혹은 렌더러에 따라 Linear, Utility – Raw 등으로 표기)로 불러와야 한다는 원칙 하나만 기억하면 됩니다.
| 맵 종류 | 올바른 색공간 | 잘못 설정 시 증상 |
|---|---|---|
| 디퓨즈/알베도(컬러) | sRGB | 색이 탁하거나 창백해 보임 |
| 러프니스 | Raw | 재질이 과도하게 매끈해짐, 하이라이트 뭉침 |
| 메탈릭 | Raw | 금속/비금속 경계 번짐, 얇은 금속부 소실 |
| Normal Map | Raw | 표면 굴곡 왜곡, 이음새(seam) 도드라짐 |
| AO | Raw | 그림자 대비가 과장되거나 약해짐 |
| 디스플레이스먼트/하이트 | Raw | 지오메트리 높낮이 왜곡 |
| 오파시티/마스크 | Raw | 투명 경계 뭉개짐, 선택 영역 오차 |
ORM 채널 패킹 텍스처를 다룰 때 주의할 점
Substance Painter나 여러 게임/실사 파이프라인에서는 AO, Roughness, Metallic을 각각 R, G, B 채널에 하나씩 욱여넣은 ORM(Occlusion-Roughness-Metallic) 텍스처를 씁니다. 저장 용량을 아끼기 위한 방식인데, 여기서 실수가 자주 나옵니다.
- ORM 텍스처 전체는 반드시 하나의 파일로 취급되고, 파일 전체에 색공간이 한 번만 적용됩니다. 그런데 이 파일 안에는 세 가지 데이터 채널이 섞여 있을 뿐, 컬러 이미지가 아닙니다. 따라서 파일 전체를 Raw로 지정해야 합니다.
- 소프트웨어에 따라 파일 확장자나 기본 프리셋 때문에 자동으로 sRGB가 잡히는 경우가 있으니, 임포트 후 색공간을 눈으로 한 번 더 확인하는 습관이 필요합니다.
- 채널을 분리해서 각각 다른 노드로 연결하더라도, “감마 디코딩 여부”는 텍스처 노드 하나에서 파일 전체에 걸리는 설정이라는 점을 잊으면 안 됩니다. 채널별로 따로 감마를 걸 수는 없습니다.
Substance에서 내보낸 맵을 Maya·Arnold로 가져올 때 체크리스트
Substance Painter에서 익스포트한 텍스처를 Maya/Arnold 씬에 연결할 때는 아래 순서로 점검하면 실수를 크게 줄일 수 있습니다.
- Substance 익스포트 프리셋이 Arnold/Metal-Roughness 계열인지 확인했는가 (프리셋마다 채널 매핑이 다름)
- 컬러(베이스컬러/알베도) 맵만 sRGB로, 나머지 데이터 맵은 전부 Raw로 지정했는가
- Maya에서 file 노드를 만들 때 Color Space 항목이 자동으로 sRGB로 잡혀 있지 않은지 직접 확인했는가
- Arnold aiStandardSurface의 Specular Roughness, Metalness 입력에 연결된 file 노드가 Raw인지 확인했는가
- ORM 패킹 텍스처라면 파일 하나 전체가 Raw로 지정되어 있는지 확인했는가
- 렌더 뷰에서 러프니스가 낮은 영역(매끈한 금속 등)이 과도하게 거울처럼 보이지 않는지 육안으로 재검토했는가
- 프로젝트에서 OCIO 설정을 쓰고 있다면, Raw/Utility 항목이 실제로 감마 디코딩 없이 통과되는 설정인지 확인했는가
증상으로 원인 역추적하기
현장에서 자주 보는 증상과 원인을 표로 정리했습니다.
| 증상 | 가능성 높은 원인 |
|---|---|
| 재질이 전체적으로 지나치게 반짝이고 매끈함 | 러프니스 맵이 sRGB로 잘못 지정됨 |
| 금속 경계가 지저분하게 번지거나 얇은 금속 라인이 사라짐 | 메탈릭 맵이 sRGB로 잘못 지정됨 |
| 그림자/구석 어두움이 과하게 진하거나 옅음 | AO 맵이 sRGB로 잘못 지정됨 |
| 표면 요철이 원래 디자인보다 과장되거나 밋밋함 | 디스플레이스먼트/하이트 맵이 sRGB로 잘못 지정됨 |
| 투명한 부분의 경계가 흐릿하게 뭉개짐 | 오파시티 맵이 sRGB로 잘못 지정됨 |
자주 묻는 질문(FAQ)
Q1. 러프니스 맵을 Raw로 바꿨는데도 결과가 크게 안 달라 보여요. 왜 그럴까요? 러프니스 값이 원래 극단적으로 낮거나(0.05 이하) 높은(0.95 이상) 영역이 대부분이라면 감마 왜곡의 절대적인 차이가 작게 느껴질 수 있습니다. 중간 톤(0.3~0.7)이 많은 텍스처일수록 Raw 전환의 효과가 뚜렷하게 나타납니다. 그래도 정확한 계산을 위해서는 항상 Raw로 지정하는 것이 원칙입니다.
Q2. 8비트 텍스처 대신 16비트나 EXR로 저장하면 이 문제가 해결되나요? 비트 심도는 색공간 문제와는 별개입니다. 16비트로 저장해도 파일을 불러올 때 sRGB로 잘못 지정하면 여전히 감마 디코딩이 걸려 값이 왜곡됩니다. 비트 심도는 계조(그러데이션)의 부드러움을 높여줄 뿐, 색공간 지정을 대신해주지는 않습니다.
Q3. 모든 렌더러에서 러프니스가 제곱으로 쓰이나요? 렌더러나 셰이더 모델의 구현 방식에 따라 러프니스를 내부적으로 변환하는 방식은 조금씩 다릅니다. GGX 계열 모델에서 러프니스가 제곱 형태로 쓰이는 경우가 흔하다는 것이 일반적인 경향이지만, 정확한 수식은 사용 중인 렌더러 문서를 참고하시는 것이 가장 정확합니다.
