brdf기반 사전정의 스킨 셰이더
TRANSCRIPT
일러두기
• 물리적으로 정확한 셰이더는 아닙니다.
–정확하게 만들 수도 있지만…
• 디퓨즈 부분에 대해서만 다루고 있습니다.
–스페큘러나 반사는 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)
이런 기술들의 목적은 하나!
• 피부가 갖는 빛에 대한 투과성을 흉내 내는 것!
–피부는 두께에 따른 빛의 파장별 반사율이 다릅니다.
–그래서 암부에 빨간 색이 묻고 흐릿한 느낌을 갖게 됩니다.
기존 셰이더들의 문제
• 무겁다!
– NVidia의 경우 머리당 라이트맵 11개!
• 이걸 매 프레임마다 Lerp해준다!
– 12 tap Approximation 의 경우에도 머리당 라이트맵 2개!
• 캐릭터 5개가 화면에 나오면?
• (머리 5 + 몸 파트 5) * 2 = 라이트맵 20개!
• UV Seam 문제
그럼 SSSSS는?
• Screen Space Sub Surface Scattering
• 화면 단위 처리기 때문에 많은 캐릭터가 나오는 장면에 적합!
–그렇지만 한명만 나오는 장면에서도 같은 비용이 발생!
• Deferred 랜더러가 필요!
– G-buffers 채널을 많이 쓴다!
• 결정적으로 S가 너무 많다!
Lambertian reflectance
• 컴퓨터 그래픽에 있어 디퓨즈 부분을 표현하는 가장 기본적인 방식.
– “표면으로부터 관찰되는 방사선의 강도는 표면 법선과 관찰자 시선 사이의 각 𝜃의 Cosine에
대해 직접적으로 비례한다.”
• 쉽게 말해 빛과 표면이 이루는 각도에 따라 음영이 결정된다는 소리.
Lambertian reflectance
• 응? 그럼 이런 것들은?
• 익히 알고 있던 셰이더 이름들은 디퓨즈 셰이딩에 관한 것이
아니었다!
• 이것들은 하이라이트, 즉 BRDF를 기반으로 한 Specular 계
산에 관한 것이었다!
–물론 Oren-Nayar-Blinn은 디퓨즈 셰이딩에 관한 것입니다.
BRDF Bidirectional reflectance distribution function
• 양방향 반사 분포 함수
–입사되는 광자들이 특정한 방향으로 나가는 확률값을 반환하는 함수
BRDF Bidirectional reflectance distribution function
• 앞의 식을 설명하자면,
– 𝜔𝜊방향으로 반사되어 나가는 복사휘도와 𝜔𝜄방향에서 들어오는 미분 복사조도 사이의 비율
–이게 Bidirectional, 양방향인 이유는 입사/반사 방향에 따라 함수 값이 달라지기 때문
–특정 식을 의미하지 않음.
• 사실 Lambert 셰이딩이 그렇게 간단하게 계산 될 수 있는 이유는 빛이 입사하는 방
향에 관계없이 모든 방향으로 같은 양의 빛을 반사한다고 가정했기 때문이다.
• 요컨대, 특정 표면이 내가 보는 시점과 빛과의 관계에 따라 갖는 특정 값을 얻는 법
이런 겁니다!
• 텍스쳐의 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을 할 수 있다는 겁니다!
BRDF를 기록한 맵 만들기 - 0
• 우리에겐 최고의 랜더링 솔루션을 제공하는 3D Studio Max가 있습니다.
–자체 랜더러도 훌륭하고요,
–업계 표준이라는 Mentalray도 탑재하고 있죠,
–거기다 모든 3D 어플리케이션 중 가장 많은 외부 랜더러를 갖고 있습니다.
–결정적으로 끝내주는 피부 셰이더를 갖고 있습니다!
아니 뭐 제가 맥스만 쓸 줄 알아서 이런게 아니라고 말은 못하겠지만…
BRDF를 기록한 맵 만들기 - 1
• Max의 Sub Surface Scattering Fast Skin shader로 피부 재질을 만들어 줍니다.
• 만들어진 재질에서 스페큘러와 반사를 없애고 디퓨즈 색을 흰색으로 바꿔 구에 적용합니다.
피부 셰이더의 두번째 특징을 재현 하려면?
• Blend Normal
–빛이 피부 속으로 확산 되는 것을 Blurring한 노멀맵으로 표현.
–원본의 R채널에 Blur를 줍니다.
–이렇게 만들어진 이미지와 원본의 GB채널을 합해 새로운 노멀맵을 만들어 줍니다.
–원본 노멀맵과 새로 만들어진 노멀맵을 BRDF 셰이딩의 R채널을 기준으로 Lerp해줍니다.
이게 뭐가 좋냐면…
• 빠릅니다!
• 필요한 텍스쳐가 적어 메모리 사용량이 매우 적습니다!
• Shader model 3.0 기반이기 때문에 어떤 플랫폼에도 적용 할 수 있습니다!
• 이 방식을 응용하면 피부 BRDF맵 뿐만 아니라 거의 모든 재질의 BRDF맵을 얻을 수
있습니다!
• 그렇지만 잘 살펴보면 단점도 있습니다.
–두께에 기반한 SSS는 불가능 합니다.
–뒤쪽에서 투과되는 빛은 따로 처리를 해줘야
합니다.
–피부에 부드럽게 떨어지는 그림자를 만들 수
없습니다.
–미리 만들어 놓아야 하는 것들이 많아 아티스
트가 최종 결과물을 예측하기가 어렵습니다.
써놓고 보니 정말 많은 단점이군요. OTL
질문사항은…
• [email protected] 으로 메일 주시거나~
• 트위터 @jalnaga나
• http://jalnaga.net에 메시지를 남겨 주시면 성심 성의껏 답변 드리겠습니다.