0

我必须旋转大于 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 函数的包装器。
4

0 回答 0