2010-06-08 62 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.