4

D3DSURFACE9 で個々のピクセルを設定しようとしていますが、あちこちに配置されています。以前にもやったことがあると思いますが、今回はうまくいきません。

3DLOCKED_RECT lrt;
if(D3D_OK == lpThis->sfRenderingCanvas->LockRect(&lrt,NULL,0))
{
   UINT pitch = lrt.Pitch;
   VOID *data;
   data = lrt.pBits;
   UINT Y = (UINT)xmsg.Y;
   UINT X = (UINT)xmsg.X;
   for(int z=0;xmsg.iNum;z++)
   {
      if( xmsg.iDataBlock[z]>0 )
         ((DWORD*)data)[X+Y*pitch+z] = 0xFFFFFF00;
      else
         ((DWORD*)data)[X+Y*pitch+z] = 0xFF000000;
      }
   }
}

Y は 0 からサーフェスの作成時に使用される高さ
までの間 X は 0 からサーフェスのピッチまでの間

誰が私が間違っているのか教えてもらえますか? また、それは私の窓の約2倍下にあるようです. (^行の 1/4 を超えて描画しようとすると、行の 1/2 をカバーします。)

4

1 に答える 1

2

D3DLOCKED_RECTに返されるピッチ値は、 DWORDの数ではなく、各行の開始間のバイト数です。DWORD ポインターを使用してバッファーにインデックスを付けているため、実質的に 4 倍のピッチを使用しています。

このようなものを試してみてください...

DWORD * row = (DWORD *)((char *)lrt.pBits + pitch * Y);
for(int z=0;xmsg.iNum;z++)
{
   if( xmsg.iDataBlock[z]>0 )
      row[X+z] = 0xFFFFFF00;
   else
      row[X+z] = 0xFF000000;
   }
}
于 2011-04-23T22:22:24.447 に答える