스마트폰에 대해서, 열풍이 불길래, 아주 잠깐, 옛날 기억을 살려서, OpenGLES용 렌더러를 살짝 만들어본적이 있는데요. 그 때, 렌더링 파워가 어느 정도까지 될까? 라는 궁금증이 있었는데, 마침 "인피니트 블레이드"라는 게임이 출시되어서, "아~ 이 정도는 되는구나!"라고 생각했었죠.
특히, 스펙큘러가 반짝 반짝 하는 것을 보고, PC에서 하는 것 처럼 했을까? 라는 생각이 들었었는데, 좀 찾아보니까, 고정 테이블을 이용한 방법이 있더군요. 살짜쿵 소개해볼까 합니다. (실제로 UDK의 모바일 셰이더를 열어보니, 요게 있더군요.)
일반적인 Specular 계산
- float BaseSpec = max(0, dot(normal, halfvector));
- float3 Specular = pow(BaseSpec, SpecPower);
- float BaseSpec = max(0, dot(normal, halfvector));
- #define SpecA 6.645
- #define SpecB -5.645
- float SpecularAmount = clamp( SpecA * BaseSpec + SpecB, 0, 1 );
- float3 Specular = BaseSpec * SpecularAmount;
(UDK를 보면, M=2일 때 보기가 좋다고 하네요...)
이게 끝입니다. ㅎㅎ 간단하죠!
이 처럼 지수 계산을 간단한 곱셈으로 줄일 수 있어서, 스펙큘러를 사용하면서도 최적화를 할 수 있습니다. (결국, mad_sat instruction 하나로 처리가 가능!)
(물론, 오차 범위나 결과의 차이는 고려해야 합니다.)
그럼 어떤 차이가 있는지 한번 볼까요?
(개인 학습용으로 개발된 렌더러에서 붙여보았습니다.)
댓글 없음:
댓글 쓰기