有没有办法在 OpenGL 上显示一个 pygame 窗口?

Posted

技术标签:

【中文标题】有没有办法在 OpenGL 上显示一个 pygame 窗口?【英文标题】:Is there a way to display a pygame window over OpenGL? 【发布时间】:2020-05-01 17:14:16 【问题描述】:

我一直在使用 PyOpenGL 和 pygame,并设法创建了一个 FPS 风格的相机对象。现在我想在屏幕中间添加一个十字准线,并可能在窗口的两侧展开以显示统计信息。

我已经对此进行了研究,看来您必须对 OpenGL 做一些奇怪的事情,例如禁用深度测试和更改投影矩阵,直到现在这些都没有真正呈现任何东西,并降低了性能。

在我看来,这应该很容易,因为我想要的只是凌驾于其他一切之上,并且永远不会移动的东西。真的没有办法告诉 pygame 在 OpenGL 上绘图,所以我可以在屏幕中间画两条线吗?

【问题讨论】:

不,没有指定的方法可以做到这一点。在 OpenGL 中执行它并没有那么复杂。 【参考方案1】:

不,没有指定的方法可以做到这一点。在 OpenGL 中执行它并不复杂。

根据您之前的问题,我假设您想使用glBegin - glEnd 序列以立即模式执行此操作。 下面我假设width 是窗口的宽度,height 是它的高度。您必须禁用深度测试并通过glPushMatrix/glPopMatrix 备份当前矩阵。为模型视图矩阵加载Identity matrix,并设置对应于窗口大小的正交投影(glOrtho):

cross_size = 100

glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glLoadIdentity()

glMatrixMode(GL_PROJECTION)
glPushMatrix()
glLoadIdentity()
glOrtho(0, width, height, 0, -1, 1)

glDisable(GL_DEPTH_TEST)

glColor3ub(128, 128, 128) # color of the crosshair
glBegin(GL_LINES)
glVertex2f(width/2 - cross_size/2, height/2)
glVertex2f(width/2 + cross_size/2, height/2)
glVertex2f(width/2, height/2 - cross_size/2)
glVertex2f(width/2, height/2 + cross_size/2)
glEnd()

glEnable(GL_DEPTH_TEST)

glMatrixMode(GL_PROJECTION)
glPopMatrix()
glMatrixMode(GL_MODELVIEW)
glPopMatrix()

确保禁用二维纹理 (glDisable(GL_TEXTURE_2D))

【讨论】:

以上是关于有没有办法在 OpenGL 上显示一个 pygame 窗口?的主要内容,如果未能解决你的问题,请参考以下文章

.png 使 pygame 变得迟钝

有没有办法在无头机器上使用使用硬件加速 OpenGL 的应用程序?

在python中没有可见窗口的OpenGL渲染视图

问题让 pygame 在 Macos 上显示除空白屏幕外的任何内容

有没有办法用 MOUSEBUTTONDOWN 事件关闭 pygame 窗口?

如何在opengl和pygames中使用键盘键移动多维数据集?