Использование ctypes.c_void_p в качестве входных данных для glTexImage2D? - PullRequest
1 голос
/ 12 мая 2009

Я использую стороннюю DLL для загрузки некоторых необработанных данных изображения, и я хочу использовать эти необработанные данные изображения в качестве текстуры в openGL. Однако функция c возвращает void *, и мне нужно каким-то образом преобразовать это, чтобы она работала в качестве параметра «пикселей» в glTexImage2D. Прямо сейчас мой код выглядит примерно так:

data = c_void_p(vdll.vlImageGetData()) 
glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB8, 1024, 1024, 0, GL_RGB, GL_UNSIGNED_BYTE, data )

Однако я получил сообщение об ошибке TypeError, в которой говорится, что данные «не могут быть преобразованы в указатель». Кто-нибудь знает, как заставить это работать?

Edit: понял это. В основном то, что я делаю, это:

data = create_string_buffer( BUFFER_SIZE )
data = dll.vlImageGetData()
glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB8, 1024, 1024, 0, GL_RGB, GL_UNSIGNED_BYTE, data )

Ответы [ 2 ]

1 голос
/ 12 мая 2009

ответ на аналогичный вопрос предлагается использовать ctypes.cast().

0 голосов
/ 29 ноября 2012

Это может или не может помочь. Существует похожая проблема при использовании c_void_p в качестве возвращаемого типа. Вместо этого я должен вернуть c_longlong И сделать несколько трюков:

если я возвращаю указатель c_types obejct, я должен привести его ссылку на POINTER к c_longlong, чтобы получить целочисленное значение для возврата. (Обратите внимание, что CFUNCTYPE не будет принимать типы POINTER (x) в качестве типа возврата):

retvalp = cast (byref (retval), POINTER (c_longlong)) #retval - это то, что я хочу вернуть возвращение retvalp.contents.value

...