Skip to content

서브서피스 스캐터링(SSS)에 의한 스킨 셰이더(6)~서브서피스 스캐터링(SSS)과 스킨 셰이더(4)

[칼럼 핵심 요약]
텍스처 좌표계 … 이것은 텍스처 좌표의 U, V계와 실 3D 공간상의 어긋남에서 오는 왜곡이다. 보다 정확한 광산란을 얻기 위해서는 이 왜곡을 보정하는 것을 고려해야 한다.

🌐 원문 링크: 表面下散乱によるスキンシェーダ(6)~表面下散乱とスキンシェーダ(4) (Mynavi News)
📅 원문 발행일: 2009-05-08 | ✍️ 저자: 西川善司 (니시카와 젠지 / Zenji Nishikawa)

NOTE

💡 현대 그래픽스 관점에서의 발전사 (Modern Retrospective)

  • 스크린 공간 SSS (SSSS): Jorge Jimenez 등이 제안한 화면 공간 분리 가능 서브서피스 스캐터링(Separable SSSS) 기법이 정립되면서 피부 렌더링의 성능 효율이 비약적으로 상승했습니다.
  • 다층 표면 모델 (Multi-layer SSS): 표피(Epidermis), 진피(Dermis), 피하지방층으로 세분화된 빛 흡수/산란 계수를 개별 프로파일링하여 영화 CG 수준의 디지털 휴먼 렌더링이 실시간으로 구현됩니다.

📖 본문 해설

[원문 리드문] > 텍스처 좌표계… 이것은 텍스처 좌표의 U, V계와 실 3D 공간상의 어긋남에서 오는 왜곡이다. 보다 정확한 광산란을 얻기 위해서는 이 왜곡을 보정하는 것을 고려해야 한다.

텍스처 좌표계로 흐림시킨 것에 의한 폐해(1)~왜곡

텍스처 좌표계 … 아래 그림에서 하얀 "□"는 2차원상에서는 같은 크기이지만, 3D실공간상에서는 귀가 안쪽에 있기 때문에 작아지고, 이것을 앞의 코와 같은 지름으로 보카해 버리면 너무 강하게 흐릿하다. 즉 피하 산란해 버린다는 것이다.

코 머리의 "□"와 귀 부분의 "□"에서는 텍스처 좌표계에서는 같은 크기이지만, 3D 실 공간에서는 귀가 안쪽에 있기 때문에 작아진다. 이것을 앞의 코와 같은 필터 지름으로 보카해 버리면 너무 강하게 흐릿하다. 즉, 피하가 너무 흩어져 버린다.코 머리의 "□"와 귀 부분의 "□"에서는 텍스처 좌표계에서는 같은 크기이지만, 3D 실 공간에서는 귀가 안쪽에 있기 때문에 작아진다. 이것을 앞의 코와 같은 필터 지름으로 보카해 버리면 너무 강하게 흐릿하다. 즉, 피하가 너무 흩어져 버린다.

이것은 텍스처 좌표의 U, V계와 실 3D 공간상의 어긋남에서 오는 왜곡이다. 보다 정확한 광산란을 얻기 위해서는 이 왜곡을 보정하는 것을 고려해야 한다.

이것에 대해서는, 미리, 텍스처 좌표와 실 3D 공간과의 어긋남의 정도를 사전에 계산해 텍스처 데이터로서 가져 두어(왜곡 보정 맵), 텍스처 좌표계에서의 보카 처리를 실시할 때에, 이 어긋남의 정도를 보카해 반경의 스케일치(축소율)로서 이용하면 된다.

사전 계산으로 깊이 정보에 음미하여 계산한 스트레치 보정 계수를 저장한 텍스처를 준비해 둔다. 이 그림의 좌상이 가로(U) 방향의 왜곡 보정 맵, 좌하가 세로(V) 방향의 왜곡 보정 맵. 횡방향 가우블러를 걸 때는 전자를 배려하고, 세로 방향일 때는 후자를 참조한다.사전 계산으로 깊이 정보에 음미하여 계산한 스트레치 보정 계수를 저장한 텍스처를 준비해 둔다. 이 그림의 좌상이 가로(U) 방향의 왜곡 보정 맵, 좌하가 세로(V) 방향의 왜곡 보정 맵. 횡방향 가우블러를 걸 때는 전자를 배려하고, 세로 방향일 때는 후자를 참조한다.

격자 무늬로 어느 정도 왜곡하의 보정이 걸리고 있는지의 검증 결과(상단과 하단에서는 흐림 직경이 다르다). 좌측이 스트레치 보정을 하지 않았을 경우의 결과, 우측이 스트레치 보정을 했을 경우의 결과격자 무늬로 어느 정도 왜곡하의 보정이 걸리고 있는지의 검증 결과(상단과 하단에서는 흐림 직경이 다르다). 좌측이 스트레치 보정을 하지 않았을 경우의 결과, 우측이 스트레치 보정을 했을 경우의 결과

텍스처 좌표계로 흐림시킨 것에 의한 폐해(2)~이음새

텍스처 좌표계의 가우스 블러를 실시하면, 텍스처의 경계 부분에 텍스처 메모리상의 초기화색(검정)이 흘러 들어 버려 최종 렌더링 결과에서 텍스처의 경계가 「이음매」로서 가시화되어 버리는 문제가 발생한다.

이것에 대해 NVIDIA는 몇 가지 해결책의 접근법이 있다고 한다.

예를 들면, 전술한 왜곡 맵을 수정하여 윤곽 부근에서는 특별한 값을 넣어 두고, 초기화 색을 참조하지 않게 하는 궁리를 넣거나, 혹은 블러의 원으로 하는 텍스처측의 α채널에 대해, 엣지 부근인지 아닌지의 플래그적으로 활용한다고 하는 아이디어도 있다. 이것은 NVIDIA의 "Adrianne"과 "Froggy"의 두 가지 데모에서 잘 수행되었다고보고되었습니다. 그러나 픽셀 셰이더에서 조건 분기 처리가 필요하므로 성능 영향은 작지 않습니다.

흐림 원본 텍스처는 이렇게 출력됩니다.흐림 원본 텍스처는 이렇게 출력됩니다.

이 때문에 텍스처 좌표계에서 단지 흐려진 것만으로는 텍스처의 초기화 색이 흐림 처리에 의해 흘러 들어 버려, 3D 모델에 텍스처 매핑했을 때에 "이음새"가 노출되어 버린다이 때문에 텍스처 좌표계에서 단지 흐려진 것만으로는 텍스처의 초기화 색이 흐림 처리에 의해 흘러 들어 버려, 3D 모델에 텍스처 매핑했을 때에 "이음새"가 노출되어 버린다

가장 간단한 구현은 텍스처의 초기화 색상을 피부의 평균 색상으로 만드는 방법입니다. NVIDIA에 따르면 이것도 충분히 효과가 있다고가장 간단한 구현은 텍스처의 초기화 색상을 피부의 평균 색상으로 만드는 방법입니다. NVIDIA에 따르면 이것도 충분히 효과가 있다고

텍스처 좌표계로 흐림시킨 것에 의한 폐해(3)~디테일의 소실

피하 산란 블러 원의 텍스처는, 3D 모델에 대해서 확산 반사의 셰이딩(Shading)를 행하고, 화상 텍스처 맵을 적용하고, 이것을 텍스처 평면에 그려낸 것이었다.

문제는 피부의 모양이나, 미세 요철을 기록한 노멀 맵의 셰이딩(Shading)(범프 맵핑)의 결과를 어떻게 취급할까…

범프 맵핑까지를 적용하여 텍스처 평면에 렌더링하고, 이것에 피하 산란 블러 처리를 적용하면,이 범프 맵핑에 의한 미세 요철의 음영이 얇아진다.

그럼, 반대로, 「초기의 확산 반사 라이팅과 피하 산란 블러」, 「이미지 텍스처 처리, 노멀 맵 처리」를 분리해 실행하는 실장 방법은 어떨까. 즉, 3D 얼굴 모델의 라이팅에서는 확산 반사의 셰이딩(Shading)만을 실시해, 이것을 텍스처 평면에 그려내, 이것에 대해 피하 산란 블러를 행해 버려, 그 결과에, 화상 텍스처나 노멀 맵과를 곱한다는 실장이다.

그러나, 이 실장법에서는 미세 요철이나 주름이 너무 강하게 남아 버려, 피하 산란 블러에 의한 촉촉한 라이팅과의 궁합이 나쁘고 부자연스럽게 보여 버리는 경우가 많다고 한다.

정지 화상 사진에서는 알기 어렵지만, 최초로 확산 반사 성분만을 피하 산란 블러시켜 나중에 텍스처 처리를 실시하면 디테일이 너무 남는 경향이 있다정지 화상 사진에서는 알기 어렵지만, 최초로 확산 반사 성분만을 피하 산란 블러시켜 나중에 텍스처 처리를 실시하면 디테일이 너무 남는 경향이 있다

NVIDIA에 의하면 이 실장은, 사진 등으로부터 작성한 텍스처와는 궁합이 좋다, 라고 한다. 이것은 사진 베이스의 피부 텍스처는 피부의 피부리나 주름의 미세 요철이, 촬영 시점에서 피하 산란을 하고 있기 때문에 적당히 흐릿하고 있어, 피하 산란 블러 결과와의 궁합이 좋기 때문이다.

그렇다면 적당히 디테일을 남기고 적당히 디테일을 잃는 방법이 좋은 것은 아닐까. 그래서 NVIDIA는 중간적인 방법을 고안했다.

최초의 피하 산란 블러에 이용하기 위한 텍스처 소재를 작성하는 단계에서는, 확산 반사의 라이팅을 보통으로 실시하는 것도, 이것과 텍스처색의 겹침에 대해서는 텍스처색을 감퇴시켜 실시한다. 그리고, 이 피하 산란 블러의 결과에 대해 한번 더, 감퇴시킨 텍스처색을 곱한다. 피하산란 블러의 전후에 감퇴시킨 텍스처 처리를 한다는 이미지다.

연산의 관점에서 보면 텍스처색이 2회 곱해지게 되므로, 이 감퇴시키는 방법이 중요해진다. 예를 들어 전단계(피하산란블러 전)에서 반, 후단계(피하산란블러)에서 절반으로, 단지 1/2로서는 1/2×1/2로 1/4이 되어 버린다. 제곱으로 원래대로 돌아가면 좋으니까, 예를 들면 "반으로 감퇴시킨다"는 것이라면 제곱근(√)을 이용하면 된다.

다만 「1/2로 결정 치기」라고 하는 정수 처리에서는 확장성이 지나치지 않기 때문에, 이것을 일반화하기 위해서 「멱승 연산」(pow함수)을 이용한다. 예를 들어 X의 제곱근은 X의 1/2승이다. NVIDIA의 실험에서는 전단계에서 텍스처색을 0.82승하고, 뒤 단계에서 0.18승한 감퇴율 파라미터를 이용했다고 한다.

이 피하 산란 블러의 전후로 텍스처 처리를 한다고 하는 처리계는 일견, 황당무료로 보이지만 NVIDIA에 의하면 실은 물리적으로도 의미가 있다고 하고 있다.

빛은 피부의 피부리와 주름을 포함한 미세 요철을 가지는 디테일층(광흡수층)에 입사하기도 하지만, 내부에서 산란하여 다시 돌아와 여기에서 출사하기 때문에 실제 문제로서 빛은 2회 이 디테일층에 관여한다. 이 전후의 텍스처색의 곱셈은 정확하게 이 현상을 근사적으로 한 것에 상당한다, 라고 하는 것이다. (계속)

빛의 입사와 출사에서 디테일 층 (흡수 층)을 통과하는 의사의 재현은 피하 산란 블러의 전후에 텍스처 처리를 행하는 것에 상당한다빛의 입사와 출사에서 디테일 층 (흡수 층)을 통과하는 의사의 재현은 피하 산란 블러의 전후에 텍스처 처리를 행하는 것에 상당한다

(트라이Z 니시카와 젠지)


🔗 연관 지식 베이스 (Wiki)

Based on Zenji Nishikawa's 3D Graphics Maniax series. Translated & Knowledge-Based for Korean Game Developers.