游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3139|回复: 4

DX9里怎么实现像街机模拟器里的双线过滤模式?

[复制链接]

32

主题

235

帖子

235

积分

中级会员

Rank: 3Rank: 3

积分
235
发表于 2009-4-23 19:37:00 | 显示全部楼层 |阅读模式
DX9里怎么实现像街机模拟器里的双线过滤模式?
因为是截取GBA的图像素材,所以图需要放大,而要想有好的效果,需要人性化的双线过滤。 [em4]

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
发表于 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是目标图一行字节数
}

32

主题

235

帖子

235

积分

中级会员

Rank: 3Rank: 3

积分
235
 楼主| 发表于 2009-4-24 18:29:00 | 显示全部楼层

Re:DX9里怎么实现像街机模拟器里的双线过滤模式?

QQQ

32

主题

235

帖子

235

积分

中级会员

Rank: 3Rank: 3

积分
235
 楼主| 发表于 2009-4-24 18:33:00 | 显示全部楼层

Re:DX9里怎么实现像街机模拟器里的双线过滤模式?

汗一个,这个代码怎么那么像DDRAW的?

30

主题

146

帖子

152

积分

注册会员

Rank: 2

积分
152
发表于 2009-4-24 19:08:00 | 显示全部楼层

Re:DX9里怎么实现像街机模拟器里的双线过滤模式?

呵呵,个人感觉吧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 15:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表