2009-05-12 19 views
1

J'utilise une DLL tierce pour charger des données d'image brutes, et je veux utiliser ces données brutes comme texture dans OpenGL. Cependant, la fonction c renvoie un void *, et j'ai besoin de le convertir pour qu'il fonctionne comme le paramètre "pixels" de glTexImage2D. En ce moment, mon code ressemble à quelque chose ceci:Utilisation de ctypes.c_void_p comme entrée de glTexImage2D?

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

Cependant, je reçois un TypeError se plaindre que les données "ne peut pas être converti en pointeur. Est-ce que quelqu'un sait comment faire fonctionner cela?

Édition: Conçu. En fait ce que je fais est la suivante:

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) 

Répondre

1

Un answer à un similar question suggéré d'utiliser ctypes.cast().

+0

Cela ne fonctionne pas car pyopenGL s'attend à ce que le paramètre pixels soit une chaîne brute. Je ne peux pas utiliser c_char_p car cela attend une chaîne terminée par un caractère nul. J'ai besoin d'un moyen de convertir ce pointeur vide en une chaîne python brute. – aeflash

+1

Avez-vous déjà vu http://osdir.com/ml/python.ctypes/2004-12/msg00002.html? Si oui et que cela n'a pas aidé, vous devriez fournir un petit script autonome que nous pouvons exécuter localement. –

0

Cela peut ou ne peut pas aider. Il y a un problème similaire lors de l'utilisation de c_void_p en tant que type de retour. Je dois à la place retourner c_longlong ET faire quelques trucs de hokey:

si je retourne un pointeur c_types obejct, je dois mouler sa référence à un POINTER à c_longlong pour obtenir la valeur entière pour retourner. (NOTE que CFUNCTYPE n'acceptera POINTER (x) types comme un type de retour):

retvalp = fonte (byref (retval), POINTER (c_longlong)) #retval est ce que je veux retourner retvalp.contents de retour. valeur

Questions connexes