настройка DirectX9 поверхности пикселей - PullRequest
4 голосов
/ 24 апреля 2011

Я пытаюсь установить отдельные пиксели в 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 и шагом поверхности

Кто-нибудь может сказать, что я делаю не так? Кроме того, кажется, что он вдвое ниже моего окна. (^ Если я попытаюсь нарисовать более 1/4 строки, она покрывает половину из них.)

1 Ответ

2 голосов
/ 24 апреля 2011

Значение высоты тона, которое возвращается в D3DLOCKED_RECT , - это количество байтов между началом каждой строки, а не количество DWORD.Вы индексируете в буфер, используя указатель DWORD, поэтому вы эффективно используете шаг в четыре раза больше.

Попробуйте что-то вроде этого ...

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;
   }
}
...