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 関数のラッパーです。