【问题标题】:Graphical Glitches in PyOpenGL with PyGamePyOpenGL 中的图形故障与 PyGame
【发布时间】:2020-05-05 00:02:51
【问题描述】:

我目前正在使用 PyGame 和 PyOpenGL 编写游戏,当使用顶点缓冲区时,会出现图形故障。故障包括在每个模型之间绘制不应该绘制的线。我发现在 Ground() 和 GroundVBO() 之间交替在大多数情况下不会导致任何图形故障。我有什么遗漏的吗?

global vbo
vbo = 0
def Ground():
    glBegin(GL_LINES)
    for edge in ground_edges:
        for vertex in edge:
            glVertex3fv(ground_verticies[vertex])
    glEnd()
def GroundVBO():
    for edge in ground_edges:
        for vertex in edge:
            ground_noot = glVertex3fv(ground_verticies[vertex])
    vbo = glGenBuffers(1)
    glBindBuffer (GL_ARRAY_BUFFER, vbo)
    glBufferData (GL_ARRAY_BUFFER, len(ground_verticies)*4, ground_noot, GL_STATIC_DRAW)
    glVertexPointer (3, GL_FLOAT, 0, None)
    glDrawArrays(GL_LINES, 0, 300)

【问题讨论】:

  • 我相信导致问题的原因是在 glBegin/glEnd 之外指定了顶点。我现在要做的就是重写一些代码,它应该可以工作了!
  • 我现在已经开始工作了,我被困在顶点指针的数字数组上,因为我正在附加整个带有括号的顶点。我必须做的是单独附加每个点,所以有括号。

标签: python opengl pygame pyopengl


【解决方案1】:

如果要使用固定功能属性,则必须通过glEnableClientState 启用客户端功能。 在循环中通过glVertex3fv 指定顶点是多余的。在glBegin/glEnd 序列之外指定顶点会导致未定义的行为。
glDrawArrays的最后一个参数是顶点坐标数:

def GroundVBO():

    vbo = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, vbo)
    glBufferData(GL_ARRAY_BUFFER, len(ground_verticies)*4, ground_noot, GL_STATIC_DRAW)

    glEnableClientState(GL_VERTEX_ARRAY)
    glVertexPointer(3, GL_FLOAT, 0, None)
    glDrawArrays(GL_LINES, 0, len(ground_verticies))
    glDisableClientState(GL_VERTEX_ARRAY)

【讨论】:

    猜你喜欢
    • 2019-06-14
    • 1970-01-01
    • 2015-10-26
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多