꽃미남 프로그래머 김포프가 창립한 탑 프로그래머 양성 교육 기관 POCU 아카데미 오픈!
절찬리에 수강생 모집 중!
프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by cagetu
오늘은 아주 아주 짧고, 간단한 내용 하나 적어볼까 합니다.

스마트폰에 대해서, 열풍이 불길래, 아주 잠깐, 옛날 기억을 살려서, OpenGLES용 렌더러를 살짝 만들어본적이 있는데요. 그 때, 렌더링 파워가 어느 정도까지 될까? 라는 궁금증이 있었는데, 마침 "인피니트 블레이드"라는 게임이 출시되어서, "아~ 이 정도는 되는구나!"라고 생각했었죠.

특히, 스펙큘러가 반짝 반짝 하는 것을 보고, PC에서 하는 것 처럼 했을까? 라는 생각이 들었었는데, 좀 찾아보니까, 고정 테이블을 이용한 방법이 있더군요. 살짜쿵 소개해볼까 합니다. (실제로 UDK의 모바일 셰이더를 열어보니, 요게 있더군요.)

일반적인 Specular 계산
float BaseSpec = max(0, dot(normal, halfvector));
// SpecPower = 8, 16, 32, ...
float3 Specular = pow(BaseSpec, SpecPower); 
PC에서도 아깝지만, 스마트폰에서 pow(x, 32)를 하면 완전 아깝죠... (실제 테스트는 안해봤어요!)
pow(x, n)을 이미 테이블로 만들어 놓은 값을 참고해서, max(A * x + B)로 만들 수가 있습니다.
float BaseSpec = max(0, dot(normal, halfvector));
// N = 18, M = 2
#define SpecA 6.645
#define SpecB -5.645
float SpecularAmount = clamp( SpecA * BaseSpec + SpecB, 0, 1 );
float3 Specular = BaseSpec * SpecularAmount;
A와 B는 이미 만들어진, 아래 테이블을 참조하여, 결정하면 됩니다. 
(UDK를 보면, M=2일 때 보기가 좋다고 하네요...) 



이게 끝입니다. ㅎㅎ 간단하죠!

이 처럼 지수 계산을 간단한 곱셈으로 줄일 수 있어서, 스펙큘러를 사용하면서도 최적화를 할 수 있습니다. (결국, mad_sat instruction 하나로 처리가 가능!)
(물론, 오차 범위나 결과의 차이는 고려해야 합니다.)

그럼 어떤 차이가 있는지 한번 볼까요? 
(개인 학습용으로 개발된 렌더러에서 붙여보았습니다.)

[pow(n, 32)의 경우]

[N=18, M=2 테이블을 이용함]


직접적인 비교는 어렵긴한데, 대충 어느 정도 차이가 나는지를 보실 수는 있을 것입니다. 너무 하이라이트가 강하게 나오는 듯 하니, M, N을 테이블에서 바꾸보면서 테스트 해보면 될 듯 합니다.

간략하게 글을 썼습니다. 원본글을 읽어보시면, 더 도움이 되실거에요. 

(http://www.gamasutra.com/view/feature/2972/a_noninteger_power_function_on_.php)

사실, PC로 개발할 때에는 이 정도 비용은 크게 신경을 쓰지 않습니다. 하지만, 최근 게임들이 다양한 PC 사양에서 돌아가게 만들도록 옵션들을 다양하게 제공합니다. 심지어는 라이팅을 완전히 하지 않는 경우도 있지요.
생각해보면, 지수 연산을 마구 쓰기시작한지는 얼마 되지 않았습니다. 리니지2 정도의 시절?만 하더라도, Pixel 라이팅 자체를 거의 사용하지 않았으니까요. (이 때는 GlossMap으로 후려쳤지요!) 그러니, 당연하다고 하기에
는 생각보다 꽤 비싼 연산입니다.

약간 하이엔드급(?) 스마트폰 개발을 한다거나, 저사양 PC를 타겟으로 개발을 해야 한다면, 테스트해보시기를 추천드립니다.

그럼 27일날 뵈어요~ 휘리릭~ ㅎㅎ

TAG

댓글을 달아 주세요

  1. Favicon of https://gamedevforever.com 대마왕J 2012.01.03 19:41 신고  댓글주소  수정/삭제  댓글쓰기

    오오오오오오 엄청나게 도움이 되는군요! 우리도 필요할때 써야지!!!

  2. Favicon of https://gamedevforever.com Silverchime 2012.01.04 09:51 신고  댓글주소  수정/삭제  댓글쓰기

    우아... 무슨 룩업테이블식으로 처리했네요. 대박입니다 완소!

  3. Favicon of https://gamedevforever.com 친절한티스 2012.01.04 10:45 신고  댓글주소  수정/삭제  댓글쓰기

    저사양 게임에서 좋겠네욤~
    우리도 필요할때 써야지!!

  4. Favicon of https://gamedevforever.com Rhea Strike 2012.01.05 07:02 신고  댓글주소  수정/삭제  댓글쓰기

    툴이 끌리는데요? ^^

  5. Favicon of https://gamedevforever.com ozlael 2012.01.06 23:35 신고  댓글주소  수정/삭제  댓글쓰기

    이해안되요 ㅠㅠ m n 은 뭐고 이게 specPower 값이랑 어케 매핑되는거임 ㅠㅠ?

  6. Favicon of http://bluekms21.blog.me 크로스 2012.01.12 11:50  댓글주소  수정/삭제  댓글쓰기

    알면 이토록 쉬운데 모르면 만들어놓고
    '왜 우리건 프레임이 이렇게 안나와?!' 하겠군요...
    좋은 팁 감사드립니다.

  7. Favicon of https://gamedevforever.com ozlael 2012.01.12 12:22 신고  댓글주소  수정/삭제  댓글쓰기

    ㅈ ㅓ 미쿸말 몰라효 번역해주세효

  8. Favicon of http://Junios.net Junios 2012.01.12 16:53  댓글주소  수정/삭제  댓글쓰기

    흠 예전 PC 사양 안 좋았을때 16비트에서 싸인, 코싸인 테이블 만들어 놓았던 기억이 새록새록 ㅎㅎ

    잘 보고 갑니다.

  9. Hybrid 2012.01.14 22:51  댓글주소  수정/삭제  댓글쓰기

    캬~ 좋네요.
    임베디드쪽 최적화하는거보면 참 감탄스러운게 많던데,
    모바일 그래픽 쪽도 저런식으로 활용하는군요.

    무지 좋은 정보가 되었습니다. +_+

  10. Favicon of https://gamedevforever.com 대마왕J 2012.01.16 00:58 신고  댓글주소  수정/삭제  댓글쓰기

    2.0 한계에 아슬아슬하게 넘어가는 쉐이더가 하나 있었는데, 이걸 이용해서 2.0에 안착시켰습니다! 감사합니다!!! ㅋ