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

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

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

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

【问题讨论】:

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

标签: python opengl pygame pyopengl opengl-compat


【解决方案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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 2020-08-31
    相关资源
    最近更新 更多