2010-06-08 66 views
2

所以我有一个x8r8g8b8格式的IDirect3DSurface9,它包含后台缓冲区的内容。当我调用LockRect时,我可以访问一个包含pBits的结构,一个指向我假设的像素的指针,以及整数Pitch(我对它的目的很不清楚)。如何读取direct3d纹理像素

如何读取各个像素?

的Visual Studio 2008 C++

回答

1

锁定的区域被存储在D3DLOCKED_RECT。我从来没有使用过这个,但文档说它是“表面的一行中的字节数”。其实人们通常会称之为“步幅”(有些术语解释为in the MSDN)。例如,如果一个像素具有4个字节(XRGB的每个分量为8位),并且纹理宽度为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

并访问组件的像素它将是: uint32_t x = mypixel [0]; uint32_t r = mypixel [1]; uint32_t g = mypixel [2]; uint32_t b = mypixel [3]; 是否正确? – 2010-06-08 15:56:48

+0

我猜测x组件只是填充,在这种特殊的格式是垃圾? – 2010-06-08 15:57:13

+0

XRGB中的X仅用于32位对齐(更快)。对组件的访问将是'uint8_t * components =(uint8_t *)mypixel;'然后'X = components [0]; R =组件[1]'等等...... – AndiDog 2010-06-08 16:21:41

0

是的,你会像这样访问像素的单个RGB组件。

像素的第一个字节没有被使用,但是使用每像素4字节的效率更高,因此每个像素都在32Bit边界上对齐(这也是为什么有音高)。

在您的示例中,未使用x,但请注意,还有其他像素格式,例如ARGB,它将alpha值(透明度)存储在第一个字节中。有时颜色也会反转(BGR而不是RGB)。如果你不确定什么字节对应于什么颜色,一个好的技巧是创建一个完全是红色,绿色或蓝色的纹理,然后检查4个字节中的哪一个具有值255.