Как читать пиксели текстуры Direct3D - PullRequest
2 голосов
/ 08 июня 2010

Итак, у меня есть IDirect3DSurface9 в формате x8r8g8b8, который содержит содержимое заднего буфера. Когда я вызываю LockRect для него, я получаю доступ к структуре, содержащей pBits, указатель на пиксели, которые я предполагаю, и целочисленную высоту тона (что мне очень неясно относительно ее назначения).

Как читать отдельные пиксели?

Visual Studio 2008 C ++

Ответы [ 2 ]

1 голос
/ 08 июня 2010

Заблокированная область сохраняется в D3DLOCKED_RECT . Я никогда не использовал это, но документация говорит, что это «Количество байтов в одном ряду поверхности». На самом деле люди обычно называют это «шагом» (некоторые термины объясняются в MSDN ).

Например, если один пиксель имеет 4 байта (8 бит для каждого компонента XRGB), а ширина текстуры равна 7, изображение обычно сохраняется как 8 * 4 байта вместо 7 * 4 байта, поскольку память может быть доступ быстрее, если данные выровнены по DWORD.

Итак, чтобы прочитать пиксель [x, y], вам нужно прочитать

uint8_t *pixels = rect.pBits;
uint32_t *mypixel = (uint32_t*)&pixels[rect.Pitch*y + 4*x];

где 4 - размер пикселя. *myPixel будет содержанием пикселя в моем примере.

0 голосов
/ 08 июня 2010

Да, вы бы получили доступ к отдельным компонентам RGB пикселя, как это.

Первый байт пикселя не используется, но более эффективно использовать 4 байта на пиксель, чтобы каждый пиксель был выровнен по границе 32-бит (это также объясняет, почему существует высота тона).

В вашем примере символ x не используется, но обратите внимание, что существуют и другие форматы пикселей, например ARGB, в котором альфа-значение (прозрачность) хранится в первом байте. Иногда цвета также меняются местами (BGR вместо RGB). Если вы не уверены, какой байт соответствует какому цвету, хороший трюк - создать текстуру полностью красного, зеленого или синего цвета, а затем проверить, какой из 4 байтов имеет значение 255.

...