我正在编写一个绘制3D场景的3D应用程序,并希望将包含文本的一些UI元素叠加到此3D场景中。为此,我使用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场景而不是文本。如果我同时评论着色器/顶点缓冲区初始化代码(当然还有三维场景绘图),我会正确地获取文本。如果我离开着色器/顶点缓冲区初始化代码并删除绘图部分,我就不会得到文本。
我预计使用glUseProgram(0)会将我还原回固定管道并让我正确地绘制文本。
有人知道我做错了什么吗?
编辑1:
我试图更好地隔离程序,我认为我找到了解决方案(我仍然不明白为什么会干扰renderText):
似乎与glBindBuffer有关。当我使用Vertex Buffers时,我忘了解开它们。现在,如果我使用:
glBindBuffer(GL_ARRAY_BUFFER, 0)
绑定缓冲区后,我终于可以看到显示的文本