将ctypes.c_void_p作为glTexImage2D的输入?

1 投票
2 回答
2492 浏览
提问于 2025-04-15 11:32

我正在使用一个第三方的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 )

但是,我遇到了一个类型错误,提示说数据“无法转换为指针”。有没有人知道怎么解决这个问题?

编辑:我搞定了。基本上我这样做:

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 个回答

0

这可能对你有帮助,也可能没什么用。这里提到一个类似的问题,就是用c_void_p作为返回类型。我这边的做法是返回c_longlong,并且还得用一些小技巧:

如果我要返回一个指向c_types对象的指针,我需要把它的引用转换成一个指向c_longlong的指针,才能得到要返回的整数值。(注意,CFUNCTYPE不接受POINTER(x)类型作为返回类型):

retvalp = cast( byref(retval), POINTER(c_longlong)) # retval是我想返回的内容
return retvalp.contents.value

1

一个回答针对一个类似的问题,建议使用ctypes.cast()这个方法。

撰写回答