旋转IDirect3DSurface9上加载的大图像

时间:2012-05-08 07:56:45

标签: c++ directx directx-9

我要旋转大于4096x4096的图像。 (即4096x8192)。

图像从文件加载到使用以下方法调用创建的IDirect3DSurface9:

CreateOffscreenPlainSurface(width, height, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &surface.s, NULL);

在StretchRect函数的帮助下完成简单的图像处理(平移和缩放)。但是,当要在表面上旋转图像时,我必须锁定源图像和目标图像的部分。然后我必须在CPU中旋转太慢的图像。这是一个简单的表面旋转90度的示例代码。

SurfaceScopedLock srcImageLock(*srcImage.s, &result);
SurfaceScopedLock dstImageLock(*dstImage.s, &result);
D3DLOCKED_RECT& lrSrc = srcImageLock.getLockedRect();
D3DLOCKED_RECT& lrDst = dstImageLock.getLockedRect();

//Format is D3DFMT_A8R8G8B8 = 4 bytes per pixel so we cast it to unsigned int
unsigned int* sourceImgData = ((unsigned int*)lrSrc.pBits);
unsigned int* destImgData = ((unsigned int*)lrDst.pBits);
int srcStep = lrSrc.Pitch / sizeof(unsigned int);
int dstStep = lrDst.Pitch / sizeof(unsigned int);
for (int i = 0; i < srcImage.height; i++)
{
    for (int j = 0; j < srcImage.width; j++)
    {
        int srcIndex = i * srcStep + j;
        int dstIndex = j * dstStep + i;
        destImgData[dstIndex] = sourceImgData[srcIndex];
    }
}

有没有办法通过任何方法加速这个过程?即将表面分成多个纹理,每个纹理旋转它们并将它们合并回来。如果是这样,有人可以提供代码示例吗?

注意:

  • 目标表面由CreateRenderTarget函数创建,可以锁定。
  • SurfaceScopedLock是IDirect3DSurface9.LockRect和UnlockRect函数的包装器。

0 个答案:

没有答案