|
전석환
98/06/22 18:23
-------------------------------------------- 16비트 컬러의 이펙트 필터 소개와 그 알고리즘 --------------------------------------------
전석환 (INGRAM)
요즘 16비트 게임이 러쉬합니다. 16비트의 구조적/운용적 난점에도 불구하고 많은 개발사들이 16비트를 선택하는데는 나름대로 이유가 있습니다. 그 어쩔 수 없는 이유중에 하나인 "16비트 모드만이 누릴수 있는 이펙트-Alpha Blend, 광원효과-" 에 대해 완벽 분석을 해보겠습니다.
아래에 부연되는 모든 연산작업은 각각 RGB별 배열로 작성하여 구현되므로 속도상 에 커다란 영향을 주지 않습니다. 참고로 하나의 효과를 구현 하기에 소요되는 배 열의 크기는 배열1[32][32], 배열2[64][64]로 long 형 선언시 20 K byte입니다.
약간의 소스도 준비되어 있으니 개념을 이해하시기 어렵지 않을겁니다.
1. Color Dodge
응용분야 : 빛 계열(전격계 포함)의 효과 및 마법에 가장 적합한 효과입니다.
알고리즘 : 표현되는 결과물(Dodge)을 위해 필요한 자재를 바탕색(BG)과 덧색 (SPR)으로 나누었을때 RGB별 공통되는 연산식은 ...
Dodge=(BG*MAXDAC)/(MAXDAC-SPR)
입니다. 이는 바탕색의 DAC가 높으면 높을수록 Dodge 본연의 색상 이 나와주는 것이며 또한 반대로 바탕색이 어두우면 어두울수록 D odge 효과가 약해진다는 것을 살펴볼 수 있습니다. 또한 Dodge 로 강렬한 표현을 하려면 배경과 마찬가지로 SPR 의 전체적인 밝기가 높아야만 원래 추구하는 이미지를 전달하게 됩니다.
주의할점은 Dodge 의 표현상 원래 SPR의 섬세한 이미지 전달을 불 가능하다는 것입니다. ( SPR 이미지의 심한 왜곡 )
2. Lighten
응용분야 : SPRITE, 원래의 색상이 필요한 -색의 왜곡없는- 다중 투명 효과.
알고리즘 : 일단 알고리즘은 상당히 간단합니다. RGB 별로 BG, SPR 중 큰 DAC 값을 취하면 그 값이 바로 Lighten 을 구현하는 값이 됩니다.
Lighten = max ( BG, SPR )
이 Lighten 효과는 Table을 필요로 하지 않기 때문에 속도상에 약 간의 이점을 가지게 됩니다. 다른 효과들과는 달리 색상의 왜곡이 전혀 없으므로 원래 SPR 에 가장 근접한 이미지를 전달할 수가 있 다는 장점도 있습니다. 하지만 알고리즘상의 문제점으로 BG 의 밝 기에 따라 생략되는 부분도 있을 수 있어 실제 SPR 이미지의 크기 중 많은 부분이 축소/생략 되는 경향또한 있습니다.
3. Screen
응용분야 : 연기같이 부드럽고-Soft touch- 연한 소재의 효과로 적합합니다. (굴뚝에서 피어나는 연기따위...)
알고리즘 : Lighten의 개량형이라 생각하면 됩니다. 연산식을 살펴보면 ...
TempSum=(MAXDAC-max(BG,SPR))/MAXDAC*min(BG,SPR) Screen=max(BG,SPR)+TempSum
다시 말하면 Lighten은 자신(SPR)의 색상을 과장하지 않지만 Scr een 은 어느정도 (어느정도라지만 일정한 왜곡률을 위한 계산식이 있다) 자신의 색상을 높여서 표현하기 때문에 원래 이미지의 축소 /생략되는 부분이 없어,실제 구현되는 이미지의 영역도 Lighten보 다 넓습니다.
4. Dodge-Screen
응용분야 : 불 계통의 모든 효과와 화염계 마법 모두.
알고리즘 : 불을 표현하는 Effect를 위해 Dodge와 Screen 을 보완하여 결합한 효과입니다. Dodge로 일단 BG 쪽의 색 왜곡을 심화하고 그뒤에 Do dge 효과로 왜곡된 메인 이미지들을 Screen 방식을 이용해 밝은색 위주로 깨끗하게 정렬합니다. 쉽게 설명드리자면 Dodge 로 BG쪽을 끌어당긴 다음 Screen으로 한번 더 Effect 를 먹인것과 다를 바가 없습니다.(하지만 효과를 재차 반복할 수는 없는 관계로 Table 을 작성하여 단 한번에 구현합니다.)
5. Screen-Dodge
응용분야 : Dodge의 특성상 BG의 왜곡 심도를 결정함에 있어 BG가 제로에 가까 운 수 혹은 제로일때 왜곡이 불가능한 것을 보완한 필터 로써 완벽 히 검은색의 BG에서도 Dodge가 구현. (플레이 스테이션에서 사용되 는 Dodge 필터 구현과 동일 )
알고리즘 : 위 5번항과 마찬가지이나 구현 순서만 바뀌면 됩니다. 일단 Screen 효과로 BG를 끌어 올린다음 Dodge로 왜곡을 심화합니다.5번항이 구 현됐다면 아주 쉬운 CASE입니다.
6. Dodge-Burn
응용분야 : 불에 타 시커멓게 그을린 듯한 효과, 굴뚝 연기.
알고리즘 : Color Dodge 효과를 정 반대로 응용한 효과로 Dodge와는 달리 SPR 색상이 높을 수록 BG 색상을 어둡게 왜곡합니다. 반대로 SPR 색상 이 낮을 수록 BG 본연의 색상이 표현되게 왜곡을 약화합니다.
DodgeBurn = (BG*(MAXDAC-SPR))/MAXDAC;
색의 왜곡을 심화하려면 ( MAXDAC-SPR )과 (MAXDAC), 분자 분모부 를 제곱 연산합니다.( 경험으로 볼때 3제곱 연산이 적당하다 )
7. Different
응용분야 : 암흑 마법 발동이나 독, 마비등의 Effect 응용 가능.
알고리즘 : BG 와 SPR 색상의 편차를 고스란히 대입하는 간단한 알고리즘.
Different=(max(BG,SPR)-min(BG,SPR))
이를 이용하여 텍스쳐 형식으로 캐릭터에게 독립적인 표현이 가능 하므로 상태 이상시 캐릭터 Status 표현으로도 응용할 수 있습니다.
==========================================================================
(주1) 위의 모든 공식은 실제 게임에서 쓰일 때에는 사전에 RGB 테이블[*][*]로 선연산하여 사용하도록 합니다. ( 그렇지 않고, Pixel 한번 처리할때마다 RealTime으로 연산하면서 구현한다면 치명적인 과부하가 발생합니다. )
15비트 컬러의 경우, Color Dodge를 예로 든다면 Dodge[32][32]의 배열을 준비 한 후,
for ( long bg=0 ; bg<32 ; bg++ ) { for ( long spr=0 ; spr<32 ; spr++ ) { Dodge[bg][spr]=(long)((bg*32)/(32.0-spr)); } }
(주) 분모측의 32.0으로 소수점을 표현한 이유는 컴파일적인 문제로 Floating 연산을 위한 것입니다.
실제 구현은,
BG와 SPR에 대해 15비트 R,G,B 값을 구해서 사전에 만들어 놓았던 테이블을 참조, 구현하도록 합니다.
아래는 간단한 예문입니다.
long d,e; WORD r,g,b;
d = dest[0];//배경 버퍼 dest 에서 BG Pixel 을 구해서 d 에 저장. e = data[0];//SPR Pixel 을 구해서 e 에 저장.
r=Dodge[(d&0x7c00)>>10][(e&0x7c00)>>10];//사전에 만들어 놓을 테이블 참조. g=Dodge[(d&0x03e0)>>5][(e&0x03e0)>>5]; b=Dodge[d&0x001f][e&0x001f];
dest[0]=(WORD)((r<<10)|(g<<5)|(b));//완성된 색을 배경 버퍼로 전송.
이상입니다.
(주2) 위에 구현된 모든 이펙트 필터를 한마디로 표현한다면 왜곡과 생략이라 할 수 있습니다. 즉 Sprite 에 의해서 표현되어지는 것이 아니라 '스프 라이트에 의해서 왜곡되어지는 배경'이 이펙트 스프라이트에 대한 정의 라 할 수 있습니다. ( 이해가 가시나요? )
(주3) 사족을 하나 달겠습니다. 위의 모든 정보들은 인터넷에서 파오거나, 어디서 보고 들은 것들이 아닙니다. 그야말로 순전히 수많은 시행착오 를 겪은 끝에 구현하게 된 것들입니다. 열심히 더 업그레이드 해주십 시요. 여러분들이 더 열심히 해 주실수록 우리 게임계의 미래는 밝아 집니다. 지켜 보겠습니다.
(주4) 이 모든것을 가능하게 곁에서 도와준 남영이와 늘 옆에서 날카로운 지적으로 날 땀흘리게 했던 응용수학의 달인 경일에게 감사와 영광을...
1997. 12. 27. INGRAM
|
댓글을 달아 주세요
댓글 RSS 주소 : http://kaoru.teamnop.com/blog/rss/comment/301댓글 ATOM 주소 : http://kaoru.teamnop.com/blog/atom/comment/301