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