ID3DXSprite接口不理解的地方 望指点
HRESULT Draw(
LPDIRECT3DTEXTURE9 pTexture,
CONST RECT * pSrcRect,
CONST D3DXVECTOR3 * pCenter,
CONST D3DXVECTOR3 * pPosition,
D3DCOLOR Color
);
这个函数只指示了来源图像区域,而没有目标图像区域
所以要对来源图像拉伸时候必须使用ID3DXSprite::SetTransform,而使用矩阵变换都只能设置一个
缩放的百分比值.
问题来了
在GDI和DDARW时代,一般只要设置RECT DestRect来表示要绘制到目标图像的那个区域
如果来源图像小于这个RECT DestRect,那么会自动拉伸缩放到合适尺寸
难道用ID3DXSprite绘制图像时候,必须还要自己手工的计算缩放百分比?
既影响性能 又不精确,请教前辈 这种情况一般怎么处理
[解决办法]
ID3DXSprite使用SetTranform来设置目标图像的大小,绘制的位置则由position决定。
下面是DX SDK中的一段代码,我稍微整理了一下,加上了注释.
//要绘制的纹理区域 RECT rcTexture = rcTexture; //绘制到屏幕上的区域 RECT rcScreen = *prcDest; OffsetRect( &rcScreen, m_x, m_y ); //要绘制的纹理 D3DXTexture9* pTexture9 = GetTexture( pElement->iTexture ); if( pTexture9 == NULL ) return E_FAIL; //计算纹理绘制时的缩放 float fScaleX = ( float )RectWidth( rcScreen ) / RectWidth( rcTexture ); float fScaleY = ( float )RectHeight( rcScreen ) / RectHeight( rcTexture ); //建立缩放矩阵 D3DXMATRIXA16 matTransform; D3DXMatrixScaling( &matTransform, fScaleX, fScaleY, 1.0f ); //设置矩阵 m_pSprite->SetTransform( &matTransform ); //计算绘制的位置 D3DXVECTOR3 vPos( ( float )rcScreen.left, ( float )rcScreen.top, 0.0f ); vPos.x /= fScaleX; vPos.y /= fScaleY; //绘制 return m_pSprite->Draw( pTexture9, &rcTexture, NULL, &vPos,TextureColor );