brdf기반 사전정의 스킨 셰이더

59
BRDF기반 사전정의 스킨 셰이더 아이덴티티 게임즈 테크니컬 아티스트 김동석

Upload: -

Post on 01-Jul-2015

4.236 views

Category:

Documents


4 download

TRANSCRIPT

BRDF기반 사전정의 스킨 셰이더

아이덴티티 게임즈

테크니컬 아티스트

김동석

발표자 소개 / 차례 / 일러두기

BRDF기반 사전정의 스킨 셰이더

발표자 소개

• 김동석

• 1999년 3D 모델러로 이 바닥에 굴러 들어옴.

• 아이닉스 소프트, 넥슨, 네오위즈를 거쳐~

• 현재 아이덴티티 게임즈에서 TA로 구르고 있습니다!

발표자 소개

• 김동석

• 1999년 3D 모델러로 이 바닥에 굴러 들어옴.

• 아이닉스 소프트, 넥슨, 네오위즈를 거쳐~

• 현재 아이덴티티 게임즈에서 TA로 구르고 있습니다!

네, 바로

차례

1. 일러두기

2. 피부 셰이더에서 제일 중요한 점 두가지

3. BRDF? 사전정의(Pre-Intergrated)?

4. 3DS Max에서 맵 만들기

5. 정리

일러두기

• 물리적으로 정확한 셰이더는 아닙니다.

–정확하게 만들 수도 있지만…

• 디퓨즈 부분에 대해서만 다루고 있습니다.

–스페큘러나 반사는 Kelemen / Szirmay - Kalos model을 쓰세요!

일러두기

• 물리적으로 정확한 셰이더는 아닙니다.

–정확하게 만들 수도 있지만…

• 디퓨즈 부분에 대해서만 다루고 있습니다.

–스페큘러나 반사는 Kelemen / Szirmay - Kalos model을 쓰세요!

• 사실 그냥 Phong Specular를 쓰셔도 괜찮을 겁니다. 아마도…

일러두기

• 물리적으로 정확한 셰이더는 아닙니다.

–정확하게 만들 수도 있지만…

• 디퓨즈 부분에 대해서만 다루고 있습니다.

–스페큘러나 반사는 Kelemen / Szirmay - Kalos model을 쓰세요!

• 사실 그냥 Phong Specular를 쓰셔도 괜찮을 겁니다. 아마도…

• 굉장히 주관적인 주장입니다.

–객관적 증명은 다음에 기회가 된다면…

피부 셰이더에서 제일 중요한 점 두 가지

뽕숑뽕숑한 피부를 만들기 위한,

피부 셰이더 하면 떠오르는 것

• 피부 셰이더라고 하면 제일먼저 뭐가 떠오르시나요?

피부 표현을 위한 도전(1)

• 2003년 Texture Space Diffusion (Borshukov et al.)

• 2005년 Gaussian Blur / Wrap lighting (Gosselin/Green)

피부 표현을 위한 도전(2)

• 2007년 NVIDIA Human Head

• 2009년 12-Tap Approximation

이런 기술들의 목적은 하나!

• 피부가 갖는 빛에 대한 투과성을 흉내 내는 것!

–피부는 두께에 따른 빛의 파장별 반사율이 다릅니다.

–그래서 암부에 빨간 색이 묻고 흐릿한 느낌을 갖게 됩니다.

즉, 이 두 가지의 피부 특징을 나타내려 한 것!

,

기존 셰이더들의 문제

• 무겁다!

– NVidia의 경우 머리당 라이트맵 11개!

• 이걸 매 프레임마다 Lerp해준다!

– 12 tap Approximation 의 경우에도 머리당 라이트맵 2개!

• 캐릭터 5개가 화면에 나오면?

• (머리 5 + 몸 파트 5) * 2 = 라이트맵 20개!

• UV Seam 문제

그럼 SSSSS는?

• Screen Space Sub Surface Scattering

• 화면 단위 처리기 때문에 많은 캐릭터가 나오는 장면에 적합!

–그렇지만 한명만 나오는 장면에서도 같은 비용이 발생!

• Deferred 랜더러가 필요!

– G-buffers 채널을 많이 쓴다!

• 결정적으로 S가 너무 많다!

BRDF? 사전정의(PRE-INTERGRATED)?

그럼 해결책이 뭔데?

Lambertian reflectance

• 컴퓨터 그래픽에 있어 디퓨즈 부분을 표현하는 가장 기본적인 방식.

– “표면으로부터 관찰되는 방사선의 강도는 표면 법선과 관찰자 시선 사이의 각 𝜃의 Cosine에

대해 직접적으로 비례한다.”

• 쉽게 말해 빛과 표면이 이루는 각도에 따라 음영이 결정된다는 소리.

Lambertian reflectance

• 응? 그럼 이런 것들은?

• 익히 알고 있던 셰이더 이름들은 디퓨즈 셰이딩에 관한 것이

아니었다!

• 이것들은 하이라이트, 즉 BRDF를 기반으로 한 Specular 계

산에 관한 것이었다!

–물론 Oren-Nayar-Blinn은 디퓨즈 셰이딩에 관한 것입니다.

BRDF Bidirectional reflectance distribution function

• 양방향 반사 분포 함수

–입사되는 광자들이 특정한 방향으로 나가는 확률값을 반환하는 함수

BRDF Bidirectional reflectance distribution function

• 앞의 식을 설명하자면,

– 𝜔𝜊방향으로 반사되어 나가는 복사휘도와 𝜔𝜄방향에서 들어오는 미분 복사조도 사이의 비율

–이게 Bidirectional, 양방향인 이유는 입사/반사 방향에 따라 함수 값이 달라지기 때문

–특정 식을 의미하지 않음.

• 사실 Lambert 셰이딩이 그렇게 간단하게 계산 될 수 있는 이유는 빛이 입사하는 방

향에 관계없이 모든 방향으로 같은 양의 빛을 반사한다고 가정했기 때문이다.

• 요컨대, 특정 표면이 내가 보는 시점과 빛과의 관계에 따라 갖는 특정 값을 얻는 법

그러나

그때는 그냥 디퓨즈는 Lambertian, 스페큘러는 BRDF인줄만 알았습니다.

그런데…

(시간이 흘러)두 가지, 새로운 것을 보게 됐다!

• 팀 포트리스2의 툰 셰이딩을 흉내 낸 것

• Arch & Design Material (3DS Max)

1. Lambert 셰이딩 계산을 UV좌표로 쓸 수 있다! 2. BRDF를 디퓨즈에도 적용 할 수 있다!

죄송합니다! 너무나 당연한걸…

이런 겁니다!

• 텍스쳐의 UV 좌표는 0~1사이의 실수입니다.

• 즉, Lambertian Reflection으로 얻어진 실수를 U좌표로 쓸 수 있다는 겁니다!

– V좌표는 무조건 0이라고 해두면…

어두운 쪽=0

밝은 쪽=1

여기에 Lambertian Reflection을 BRDF로 바꾸면…

• Lambert 셰이딩은 빛과 표면에 관한 값만 나옵니다. 이걸 V축 좌표로 삼고,

• 시점과 표면에 관한 dot product 값을 구해서 U축 좌표로 삼으면…

• 물체의 뒤편에 빛이 있을 때 표면의 빛 정보를 텍스쳐에서 얻어 올 수 있습니다.

여기에 Lambertian Reflection을 BRDF로 바꾸면…

• Lambert 셰이딩은 빛과 표면에 관한 값만 나옵니다. 이걸 V축 좌표로 삼고,

• 시점과 표면에 관한 dot product 값을 구해서 U축 좌표로 삼으면…

• 물체의 뒤편에 빛이 있을 때 표면의 빛 정보를 텍스쳐에서 얻어 올 수 있습니다.

여기에 Lambertian Reflection을 BRDF로 바꾸면…

• Lambert 셰이딩은 빛과 표면에 관한 값만 나옵니다. 이걸 V축 좌표로 삼고,

• 시점과 표면에 관한 dot product 값을 구해서 U축 좌표로 삼으면…

• 물체의 뒤편에 빛이 있을 때 표면의 빛 정보를 텍스쳐에서 얻어 올 수 있습니다.

즉, (텍스쳐만 있다면)Sub Surface Scattering을 할 수 있다는 겁니다!

여기에 Lambertian Reflection을 BRDF로 바꾸면…

• Lambert 셰이딩은 빛과 표면에 관한 값만 나옵니다. 이걸 V축 좌표로 삼고,

• 시점과 표면에 관한 dot product 값을 구해서 U축 좌표로 삼으면…

• 물체의 뒤편에 빛이 있을 때 표면의 빛 정보를 텍스쳐에서 얻어 올 수 있습니다.

즉, (텍스쳐만 있다면)Sub Surface Scattering을 할 수 있다는 겁니다!

3DS MAX에서 맵 만들기

그럼 그 텍스쳐는 어디서 구하는데?

BRDF를 기록한 맵 만들기 - 0

• 우리에겐 최고의 랜더링 솔루션을 제공하는 3D Studio Max가 있습니다.

–자체 랜더러도 훌륭하고요,

–업계 표준이라는 Mentalray도 탑재하고 있죠,

–거기다 모든 3D 어플리케이션 중 가장 많은 외부 랜더러를 갖고 있습니다.

–결정적으로 끝내주는 피부 셰이더를 갖고 있습니다!

아니 뭐 제가 맥스만 쓸 줄 알아서 이런게 아니라고 말은 못하겠지만…

BRDF를 기록한 맵 만들기 - 1

• Max의 Sub Surface Scattering Fast Skin shader로 피부 재질을 만들어 줍니다.

• 만들어진 재질에서 스페큘러와 반사를 없애고 디퓨즈 색을 흰색으로 바꿔 구에 적용합니다.

BRDF를 기록한 맵 만들기 - 2

BRDF를 기록한 맵 만들기 - 2

BRDF를 기록한 맵 만들기 - 2

이렇게 만들어진 맵을 셰이더에 적용하면~

Lambert Shading BRDF Skin Shading

확대해서 보면…

요렇게 바알갛게 핏기가 올라옵니다.

첫번째 피부 셰이더의 특징은 만들었다면, 두번째 특징은?

피부 셰이더의 두번째 특징을 재현 하려면?

• Blend Normal

–빛이 피부 속으로 확산 되는 것을 Blurring한 노멀맵으로 표현.

–원본의 R채널에 Blur를 줍니다.

–이렇게 만들어진 이미지와 원본의 GB채널을 합해 새로운 노멀맵을 만들어 줍니다.

–원본 노멀맵과 새로 만들어진 노멀맵을 BRDF 셰이딩의 R채널을 기준으로 Lerp해줍니다.

BRDF 셰이딩의 R채널을 기준으로?

• BRDF 셰이딩으로 얻어지는 것은 피부 속으로 RGB 각각의 빛이 투과하는 양.

BRDF 셰이딩의 R채널을 기준으로?

• BRDF 셰이딩으로 얻어지는 것은 피부 속으로 RGB 각각의 빛이 투과하는 양.

BRDF 셰이딩의 R채널을 기준으로?

• BRDF 셰이딩으로 얻어지는 것은 피부 속으로 RGB 각각의 빛이 투과하는 양.

BRDF 셰이딩의 R채널을 기준으로?

• BRDF 셰이딩으로 얻어지는 것은 피부 속으로 RGB 각각의 빛이 투과하는 양.

BRDF 셰이딩의 R채널을 기준으로?

• BRDF 셰이딩으로 얻어지는 것은 피부 속으로 RGB 각각의 빛이 투과하는 양.

즉, 어떻게 노멀맵을 섞어야 하는지를 얻을 수 있다.

그럼 왜 R채널만 Blur 주는데?

• 모든 채널에 Blur를 주면 세세한 디테일이 전부 사라집니다!

Original Normal Blend Normal Blur Normal

이렇게 만들어진 BRDF기반 사전정의 피부 셰이더입니다!

이렇게 만들어진 BRDF기반 사전정의 피부 셰이더입니다!

이렇게 만들어진 BRDF기반 사전정의 피부 셰이더입니다!

이렇게 만들어진 BRDF기반 사전정의 피부 셰이더입니다!

이렇게 만들어진 BRDF기반 사전정의 피부 셰이더입니다!

이렇게 만들어진 BRDF기반 사전정의 피부 셰이더입니다!

정리 (CONCLUSION)

이제 마무리네요!

BRDF기반 사전정의 피부 셰이더

• BRDF: 빛만을 고려한 것이 아닌, 시점까지 고려한

• 사전 정의: BRDF 맵과 Blend 노멀맵을 미리 만들어 놓은

•피부 셰이더!

이게 뭐가 좋냐면…

• 빠릅니다!

• 필요한 텍스쳐가 적어 메모리 사용량이 매우 적습니다!

• Shader model 3.0 기반이기 때문에 어떤 플랫폼에도 적용 할 수 있습니다!

• 이 방식을 응용하면 피부 BRDF맵 뿐만 아니라 거의 모든 재질의 BRDF맵을 얻을 수

있습니다!

• 그렇지만 잘 살펴보면 단점도 있습니다.

–두께에 기반한 SSS는 불가능 합니다.

–뒤쪽에서 투과되는 빛은 따로 처리를 해줘야

합니다.

–피부에 부드럽게 떨어지는 그림자를 만들 수

없습니다.

–미리 만들어 놓아야 하는 것들이 많아 아티스

트가 최종 결과물을 예측하기가 어렵습니다.

써놓고 보니 정말 많은 단점이군요. OTL

그래도…

• MMORPG에도 적용 가능한, 간단하지만 효과 좋은 피부 셰이더라 자부합니다!

질문사항은…

[email protected] 으로 메일 주시거나~

• 트위터 @jalnaga나

• http://jalnaga.net에 메시지를 남겨 주시면 성심 성의껏 답변 드리겠습니다.

끝!