1

我正在编写一个 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)

绑定缓冲区后,我终于可以看到显示的文本

4

0 回答 0