편집 : 최소한의 실패한 테스트 케이스가 여기 GitHub의에 지금 : https://github.com/shadowmint/Panda-setRamImage-problem어떻게 panda3d에서 setRamImage를 사용합니까?
-
나는 * 거기에 RGB 픽셀 데이터를 파이썬으로 다시 포인터 부호없는 문자를 전달하는 C 라이브러리를 가지고있다. 이 작업을 수행하는
파이썬 API는 다음과 같습니다 Panda3D를에서
# unsigned char *ar_get_rgb(void *handle);
libar.ar_get_rgb.argtypes = [ c_void_p ]
libar.ar_get_rgb.restype = POINTER(c_char)
나는 질감으로이 데이터를 렌더링하기 위해 노력하고있어. 내가 지금를 사용하기 위해 노력하고있어 결과로 http://www.panda3d.org/forums/viewtopic.php?t=13183, 그리고 : http://www.panda3d.org/blog/?p=96
는 그러나, 나는이 일을하는 것은 내가 여기서 논의했습니다 꽤 심각한 한계를 가지고 있음을 발견 :이 블로그 포스트는 방법에 대해 여기 텍스처 메모리를 설정하기위한 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)의 데이터를 설정하기 위해 호출하면 내가 얻을 :
나는이 '4'길이의 출처에 관해서는 의아해 해요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):
, 때문에 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
이 PTAUchar.setData 또는 PTAUchar.setSubdata로 공급 할 수있는 무언가에 내 서명 숯불에 * 배열을 변환하는 방법이 있어야합니다, 그러나 나는 그것을 이해할 수 없다.
도움!
Panda의 최근 개발 빌드를 사용하는 경우 Python 버퍼 프로토콜을 노출하는 모든 객체를 PTAUchar 생성자에 전달할 수 있어야합니다. 이는 문자열을 통해 복사하는 것보다 훨씬 효율적입니다. Panda3D 블로그의 최신 게시물을 참조하십시오. – rdb