"게임 개발 테크닉" 이라는 책에서 나오는 건데요
16비트 그래픽의 32비트 알파 블렌딩 처리<<- 라고 써있는...
무슨 마스크 처리를 해서 2픽셀씩 한다는 것 같은데...
여지껏 해본 것 중에 가장 빠르더군요. 스왑같은 것도 없고...
그런데 문제는...멀쩡하게 안된다는 소리죠..ㅡㅡ;;
먼저 그 책에 소스를 보자면
#define _G_R_B 0x03e07c1f
#define R_B_G_ 0x7c1f03e0
unsigned long p1,p2;
unsigned long *s1, *s2, *d;
int x,y;
int address;
int alpha2 = 32 - alpha;
s1 = (unsigned long *)src1;
s2 = (unsigned long *)src2;
d = (unsigned long *)dest;
for(y=0; y<스크린Height; y++)
{
address = y*스크린Width/2;
for(x=0; x<스크린Width/2; x++)
{
p1 = s1[address+x];
p2 = s2[address+x];
d[address+x] = (( ((p1 & R_B_G_)>>5) * alpha +
((p2&R_B_G_)>>5) * alpha2) & R_B_G_) |
( (( ((p1&_G_R_B) * alpha)>>5) & _G_R_B) +
(( ((p2 & _G_R_B) * alpha2)>>5) & _G_R_B) );
}
}
이러하답니다. -_-;; (한글로 스크린이라 쓴건 타이핑 하기 귀찬아서..)
그리고 아래가 제 소스 입니다;;
LData->alpha = 1;
LData->alpha2 = 32-LData->alpha;
LData->s1 = (unsigned long *)LData->BePaint[0].GetData();
LData->s2 = (unsigned long *)LData->BePaint[1].GetData();
LData->d = (unsigned long *)draw->GetScreen();
for(WORD y=0; y<600; y++)
{
LData->address = y*800/2;
for(WORD x=0; x<800/2; x++)
{
LData->p1 = LData->s1[LData->address+x];
LData->p2 = LData->s2[LData->address+x];
LData->d[LData->address+x] = (( ((LData->p1 & _R_B_G)>>5) * LData->alpha +
((LData->p2&_R_B_G)>>5) * LData->alpha2) & _R_B_G) |
( (( ((LData->p1&_G_R_B) * LData->alpha)>>5) & _G_R_B) +
(( ((LData->p2 & _G_R_B) * LData->alpha2)>>5) & _G_R_B) );
}
}
LData는 걍 구조체일 뿐입니다~
그리고 저 소스를 실행 시킨 모습이 아래..(알파값 1, 0~32의 값을 주는거라고 써있길래..1을 줘봤음..
0을 주거나 32를 주면 그림은 멀쩡한데 색이 형광 연두색?? 같은 이상한 색이 전체적으로 깔림..)
어디가 문제인지..;;
그래픽카드가 555인지 565인지 확인을...^^