編輯: 一個最小的失敗測試用例現在在GitHub上的位置: https://github.com/shadowmint/Panda-setRamImage-problem如何在panda3d中使用setRamImage?
-
我有一個傳遞一個無符號字符*指針回到與它的RGB像素數據蟒蛇C庫。
Python API中要做到這一點:
# unsigned char *ar_get_rgb(void *handle);
libar.ar_get_rgb.argtypes = [ c_void_p ]
libar.ar_get_rgb.restype = POINTER(c_char)
在Panda3D中我試圖使這個數據作爲紋理。有一個博客張貼在這裏如何說: http://www.panda3d.org/blog/?p=96
然而,我發現,這樣做有一些很嚴重的侷限性,我已經在這裏討論:http://www.panda3d.org/forums/viewtopic.php?t=13183,正如我現在導致我試圖使用setRamImage()api設置紋理內存。
有好像必須有辦法做到這一點,但只有這樣,我能夠在目前使用紋理上的逐像素集通話,具體如下:
def updateTextureTask(self, t):
expectedSize = self.getExpectedRamImageSize()
print("Expected length: " + str(expectedSize))
(rgb, depth) = self.__vision.next()
p = PTAUchar.emptyArray(expectedSize)
for i in range(0, self.__vision.width * self.__vision.height * 3):
p.setElement(i, ord(rgb[i]))
print("PTAU length: " + str(p.size()))
self.setRamImage(CPTAUchar(p))
return Task.cont
這有效......但它每2秒運行一次令人驚歎的1幀。
如果我打電話p.setData(RGB)設置PTAUchar(提示:http://www.panda3d.org/dox/python/html/classpanda3d_1_1core_1_1PTAUchar.html)的數據,我得到:
Expected length: 921600
RGB buffer size: 921600 <-- C debugging data
PTAU length: 4
Assertion failed: compression != CM_off || image.size() == do_get_expected_ram_image_size() at line 833 of panda/src/gobj/texture.cxx
Traceback (most recent call last):
我困惑的是這個地方 '4' 長從何而來,因爲RGB排列在第20個多值的垃圾場是這樣的:
0: 163, 1: 151, 2: 162, 3: 85, 4: 83, 5: 190, 6: 241, 7: 252, 8: 249, 9: 121, 10: 107, 11: 82, 12: 20, 13: 19, 14: 233, 15: 226, 16: 45, 17: 81, 18: 142, 19: 31
PTAU length: 4
必須有我無符號的char *數組轉換成的東西,可以送入PTAUchar.setData或PTAUchar.setSubdata的方式,但我無法弄清楚。
幫助!
如果您使用Panda的最新開發版本,您應該能夠將任何公開Python緩衝區協議的對象傳遞給PTAUchar構造函數,這比通過字符串進行復制要高效得多。另請參閱Panda3D博客上的最新帖子。 – rdb 2014-04-20 11:13:52