卡片召唤师
精华
|
战斗力 鹅
|
回帖 0
注册时间 2002-1-28
|
不打你了......数学是枯燥了点,但图形学缺了他可不行。
Alpha Blend 用这个:
// Calculate DIB pixel offset
inline int GetOffset(BITMAPINFO * pBMI, int x, int y)
{
if ( pBMI->bmiHeader.biHeight > 0 ) // for bottom up, reflect y
y = pBMI->bmiHeader.biHeight - 1 - y;
return ( pBMI->bmiHeader.biWidth * pBMI->bmiHeader.biBitCount + 31 )
/ 32 * 4 * y +
( pBMI->bmiHeader.biBitCount / 8 ) * x;
}
// Alpha Blending between two 32-bpp DIBs
BOOL AlphaBlend3232(BITMAPINFO * pBMIDst, BYTE * pBitsDst, int dx, int
dy, int w, int h,
BITMAPINFO * pBMISrc, BYTE * pBitsSrc, int sx, int sy,
BLENDFUNCTION blend)
{
int alpha = blend.SourceConstantAlpha; // constant alpha
int beta = 255 - alpha; // constant beta
int format;
if ( blend.AlphaFormat==0 )
format = 0;
else if ( alpha==255 )
format = 1;
else
format = 2;
for (int j=0; j<h; j++)
{
BYTE * D = pBitsDst + GetOffset(pBMIDst, dx, j + dy);
BYTE * S = pBitsSrc + GetOffset(pBMISrc, sx, j + sy);
int i;
switch ( format )
{
case 0: // constant alpha only
for (i=0; i<w; i++)
{
D[0] = ( S[0] * alpha + beta * D[0] + 127 ) / 255;
D[1] = ( S[1] * alpha + beta * D[1] + 127 ) / 255;
D[2] = ( S[2] * alpha + beta * D[2] + 127 ) / 255;
D[3] = ( S[3] * alpha + beta * D[3] + 127 ) / 255;
D += 4; S += 4;
}
break;
case 1: // alpha channel only
for (i=0; i<w; i++)
{
beta = 255 - S[3];
D[0] = S[0] + ( beta * D[0] + 127 ) / 255;
D[1] = S[1] + ( beta * D[1] + 127 ) / 255;
D[2] = S[2] + ( beta * D[2] + 127 ) / 255;
D[3] = S[3] + ( beta * D[3] + 127 ) / 255;
D += 4; S += 4;
}
break;
case 2: // both constant alpha and alpha channel
for (i=0; i<w; i++)
{
beta = 255 - ( S[3] * alpha + 127 ) / 255;
D[0] = ( S[0] * alpha + beta * D[0] + 127 ) / 255;
D[1] = ( S[1] * alpha + beta * D[1] + 127 ) / 255;
D[2] = ( S[2] * alpha + beta * D[2] + 127 ) / 255;
D[3] = ( S[3] * alpha + beta * D[3] + 127 ) / 255;
D += 4; S += 4;
}
}
}
return FALSE;
}
我说的不清楚,原意是把方形活动块的底色去掉。但叠加使用的话可以出现人物走到篱笆后面去,函数原型:
BOOL TransparentBlt(
HDC hdcDest,
int nXOriginDest,
int nYOriginDest,
int nWidthDest,
int hHeightDest,
HDC hdcSrc,
int nXOriginSrc,
int nYOriginSrc,
int nWidthSrc,
int nHeightSrc,
UINT crTransparent
);
唉,这些东西太复杂,要么就是我太笨,很多地方还是搞不明白...... |
|