在Python中调用OpenGL扩展

2 投票
2 回答
1409 浏览
提问于 2025-04-16 19:59

我在Ubuntu Natty上使用PyOpenGL 3。

我想用一下glDrawElementsBaseVertex这个函数。

我在glxinfo的输出中看到了这个函数,所以我知道我的显卡支持它。

但是,我找不到怎么真正调用这个函数。当我import OpenGL.GL的时候,如果我尝试使用这个函数,就会出现NameError的错误。(这和它是None不一样。)

2 个回答

1

OpenGL的扩展功能必须由绑定本身提供,PyOpenGL并不支持“链式加载”新的扩展;虽然可以实现这样的功能,但其实没必要花那么多精力去做。

也许你没有正确访问扩展。PyOpenGL的文档里解释了几种方法可以做到这一点。

http://pyopengl.sourceforge.net/documentation/opengl_diffs.html

扩展和条件功能 PyOpenGL支持大多数OpenGL扩展。扩展可以通过导入构造好的扩展包名称,以“正常”的函数指针形式使用,比如:

from OpenGL.GL.ARB.vertex_buffer_object import * buffer = glGenBuffersARB(1)

对于扩展模块,不需要调用初始化函数或类似的东西。如果你愿意,可以调用扩展的“init”函数来获取一个布尔值,表示本地机器是否支持某个扩展,像这样:

if glInitVertexBufferObjectARB():     
     ...

不过,通常来说,检查你想使用的入口点的布尔值会更清晰:

if (glGenBuffersARB): 
    buffers = glGenBuffersARB( 1 )

通常会有多个入口点实现相同的API,你可能想使用其中可用的实现(可能会有一些优先级)。OpenGL.extensions模块提供了一种简单的机制来支持这一点:

from OpenGL.extensions import alternate
glCreateProgram = alternate( 'glCreateProgram', glCreateProgram, glCreateProgramObjectARB)
glCreateProgram = alternate( glCreateProgram, glCreateProgramObjectARB)

如果第一个元素是字符串,它将被用作备用对象的名称,否则名称将取自第一个参数。

5

试着通过它的扩展名来导入这个函数:

>>> from OpenGL.GL.ARB.draw_elements_base_vertex import *
>>> glDrawElementsBaseVertex
<OpenGL.platform.baseplatform.glDrawElementsBaseVertex object at 0x031D7B30>

撰写回答