레이블이 Gamma인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Gamma인 게시물을 표시합니다. 모든 게시물 표시

2012년 1월 25일 수요일

디테일맵과 감마보정에 대한 뻘쭘 경험담


디퓨즈 맵에 디테일 맵을 곱하는 방법은 텍스처 타일링으로 인해 발생하는 반복패턴을 숨길 때 사용할 수 있는 좋은 방법입니다.

스페이스 마린을 제작하는 도중에도 아티스트의 요청에 따라 이런 일을 하는 쉐이더를 만든 적이 있는데요. (스페이스 마린에 들어가는 쉐이더는 거의 전부 제가 작성했음... Shader Guy = Pope 였다는...).  그 때 제가 사용했던 블렌딩(?) 공식은 다음과 같았습니다.


디퓨즈맵 * 디테일맵 * 2

마지막에 2를 곱해준 이유는 디퓨즈 맵보다 밝은 색을 만드는 것이 가능하게 하기 위해서였죠. (이게 없으면 쉐이더에서 구해오는 텍스처맵의 범위는 0 ~ 1(0~100%)이기 때문에 디퓨즈맵을 어둡게 만드는 효과밖에 없습니다.) 따라서 아티스트가 디테일맵을 50%  회색(0.5)으로 칠하면 최종결과는 디퓨즈맵의 색과 같게 됩니다.

이 방법이 한동안 아무 무리 없이 작동했었는데.. 그 후에 렌더링 엔진을 "감마 친화적"으로 만들면서 좀 이상해졌습니다. 텍스처를 읽어올 때 하드웨어 자체에서 sRGB 변환을 켜줬는데, 실수로 디테일맵을 읽어올 때도 자동변환 기능을 켜버린 거죠.... 그리고 한 두달이 지나는 동안 이 새로운 쉐이더를 이용한 몇몇 아트들이 탄생했죠.


이 쯤되서 기술력 위주의 아티스트 한 명이 디테일 텍스처의 값을 0.5로 설정하면 최종결과가 디퓨즈맵의 색보다 어두워진다는걸 발견했습니다.... 아뿔싸.... 그 이유는 하드웨어에서 자동으로 sRGB -> Linear 변환을 사용한 결과 저희 공식이 이따위가 되었기 때문이지요.


{ (디퓨즈맵 ^ 2.2) * (디테일맵 ^ 2.2) * 2 } ^ (1/2.2)

0.5에 2.2 제곱을 하면 이 값이 0.25 보다도 작아지기 때문에 여기에 2를 곱해도 50프로보다도 더 어두워지기 때문.... 고치는 건 간단했습니다. 디테일맵을 읽어올때 자동 sRGB 변환을 꺼줬죠. 이래서 블렌딩 연산이 다음과 같이 되었습니다.

{ (디퓨즈맵 ^ 2.2) * 디테일맵 * 2 } ^ (1/2.2)

훨 낫죠?

이제 쉬운건 끝났고.. 그 다음은 아티스트들에게 지난 한두달 동안 이 쉐이더를 이용해서 만든 아트들을 다시 고쳐달라고 할 차례였죠. 뭐, 그리 무리한 요구는 아니였습니다. 지난 한 두달간 새로 만든 아트가 몇 안되었거든요. 디테일맵을 고치는 방법은 매우 간단했습니다.
  1. 포토샵에서 디테일 맵을 연다.
  2. 메인 메뉴에서 Image > Adjustment > Exposure를 선택한다.
  3. gamma를 0.454545(1 / 2.2와 같음)로 정해준다.
  4. OK를 누른다.
하지만 이번에는 시각위주의 아티스트가 디테일맵 대신 디퓨즈맵을 바꾸고 싶다고 하더군요. 디테일맵의 감마를 고쳐주니까 너무 어둡게 보여서 작업하는데 힘드시다고... 기존에 있던 디퓨즈맵을 새로운 공식에 맞게 고칠 수 있는 방법을 알려달라더군요. 위에서 디테일맵을 간단히 바꿀수 있었듯이... 그래서 곰곰히 생각해봤는데 수학적으로 옳게 변환을 할 수 있는 방법이 딱히 안떠오르더군요. 그래서.... '직접 눈으로 결과를 확인하시면서 변환을 하셔야 할 것 같네요. 죄송합니다~'라고 해드릴 수밖에 없었던 일이 있습니다.

뒤돌아보면 이게 수학적으로 옳은 것이 아티스트의 삶을 좀더 평안하게 만들 수 있었던 흔치않던 경우라고 생각하는데요... 뭐 불행히도 디퓨즈맵을 변환하는 공식을 찾을 수 없었으니... 제가 멍청한 건지도 모르지만 일단 불가능하다고 생각...

혹시 이거 할 수 있는 공식 아시는분은 연락주세요 ^^