|
|
发表于 2009-4-23 20:17:00
|
显示全部楼层
Re: DX9里怎么实现像街机模拟器里的双线过滤模式?
32位图的双线性插值,如果要实时算的话,还是用汇编的好。
// 这里要-1,是因为在放大情况下最后一行列必须有可以做插值的对象
float heiint = SourHeight > DestHeight ?
(float)SourHeight / DestHeight : (float)(SourHeight - 1) / DestHeight;
float widint = SourWidth > DestWidth ?
(float)SourWidth / DestWidth : (float)(SourWidth - 1) / DestWidth;
float rowint = 0.0f, colint = 0.0f;
UINT row = 0, col = 0;
UCHAR clrlu[4], clrru[4], clrld[4], clrrd[4];
int rowintege;
float rowscl, rowrscl;
int colintege;
float colscl, colrscl;
int nleftup;
float flu, fru, fld, frd;
COLORRGBA *pDest32; // DWORD
BYTE *pSour32, *pSourTemp;
for ( row = 0, rowint = 0.0f; row < DestHeight; row++, rowint += heiint )
{
rowintege = (int)rowint;
rowscl = rowint - rowintege;
rowrscl = 1.0f - rowscl;
pDest32 = (COLORRGBA *)pDest;
pSour32 = pSour + SourPitch * rowintege; // SourPitch是源图一行字节数
for ( col = 0, colint = 0.0f; col < DestWidth; col++, colint += widint )
{
colintege = (int)colint;
colscl = colint - colintege;
colrscl = 1.0f - colscl;
// 计算插值因子
flu = rowrscl * colrscl;
fru = rowrscl * colscl;
fld = rowscl * colrscl;
frd = rowscl * colscl;
// 获取左右上下四个点的颜色
nleftup = colintege << 2;
pSourTemp = pSour32 + nleftup;
*(UINT*)clrlu = *(UINT*)pSourTemp;
*(UINT*)clrru = *(UINT*)( pSourTemp + 4 );
*(UINT*)clrld = *(UINT*)( pSourTemp + SourPitch );
*(UINT*)clrrd = *(UINT*)( pSourTemp + SourPitch + 4 );
*pDest32 = (COLORRGBA)ARGB32(
(u8)(clrlu[3] * flu + clrru[3] * fru + clrld[3] * fld + clrrd[3] * frd),
(u8)(clrlu[2] * flu + clrru[2] * fru + clrld[2] * fld + clrrd[2] * frd),
(u8)(clrlu[1] * flu + clrru[1] * fru + clrld[1] * fld + clrrd[1] * frd),
(u8)(clrlu[0] * flu + clrru[0] * fru + clrld[0] * fld + clrrd[0] * frd) );
pDest32++;
}
pDest += DestPitch; // DestPitch是目标图一行字节数
} |
|