我正在编写一个 3D 应用程序,它绘制一个 3D 场景并希望在这个 3D 场景上覆盖一些包含文本的 UI 元素。为此,我使用 Python 以及 PySide 和 PyOpenGL 库。我在 ubuntu linux(专有驱动程序)上使用 NVIDIA 卡。
我的paintGL函数看起来很像这样:
def paintGL(self):
# Various clears...
self.draw_3d_scene()
self.draw_ui()
在该draw_3d_scene
方法中,我使用自定义着色器来显示我的 3d 对象(主要是球体)。着色器和顶点缓冲区对象在代码的不同部分初始化,如果重要的话,在调用 initializeGL 之后。
在draw_ui
我尝试以这种方式绘制文本时:
def draw_ui(self):
glUseProgram(0)
glColor3f(0.0, 0.0, 0.0) # Black text
self.renderText(100, 100, "Hello, World")
如果我以这种方式运行程序,我会获得 3D 场景,但不会获得文本。如果我同时注释着色器/顶点缓冲区初始化代码(当然还有 3d 场景绘图),我会正确获取文本。如果我离开着色器/顶点缓冲区初始化代码并删除绘图部分,我不会得到文本。
我希望使用 glUseProgram(0) 将我恢复到固定管道并让我正确绘制文本。
有人知道我做错了什么吗?
编辑1:
我试图更好地隔离程序,我想我找到了解决方案(我仍然不明白为什么这会干扰 renderText):
似乎与 glBindBuffer 有关。当我使用顶点缓冲区时,我忘记取消绑定它们。现在,如果我使用:
glBindBuffer(GL_ARRAY_BUFFER, 0)
绑定缓冲区后,我终于可以看到显示的文本