【问题标题】:window crash and partial rendering in openglopengl中的窗口崩溃和部分渲染
【发布时间】:2020-08-03 02:50:30
【问题描述】:

执行时并非所有行都打印在窗口上。此外,在函数 showScreen 中的 glutSwapBuffers() 之后窗口崩溃。这是一张图片:https://imgur.com/n0oBJx9

w, h, g = 1200, 900, 1

def plot(coordinates, stringa, g, Px, Px1):
    x, y = coordinates
    while Px >= Px1:
        glBegin(GL_LINES)
        if stringa[Px] == "A":
            glVertex2f(x, y)
            glVertex2f(x, y - g)
            y -= g
        elif stringa[Px] == "B":
            glVertex2f(x, y)
            glVertex2f(x + g, y)
            x += g
        elif stringa[Px] == "C":
            glVertex2f(x, y)
            glVertex2f(x, y + g)
            y += g
        elif stringa[Px] == "D":
            glVertex2f(x, y)
            glVertex2f(x - g, y)
            x -= g
        glEnd()
        Px -= 1

def iterate():
    glViewport(0, 0, 500, 500)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    glOrtho(0.0, 500, 0.0, 500, 0.0, 1.0)
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

def showScreen(coordinates, stringa, g, Px, Px1):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    iterate()
    glColor3f(1.0, 0.0, 3.0)
    plot(coordinates, stringa, g, Px, Px1)
    glutSwapBuffers()
    time.sleep(5)

glutInit()
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE |GLUT_RGBA)
glutInitWindowSize(w, h)
window = glutCreateWindow("dragon curve in Opengl")
glutDisplayFunc(showScreen([300, 400], stringa, x, len(stringa)-1, 0))
glutIdleFunc(showScreen([300, 400], stringa, x, len(stringa)-1, 0)) 
end = time.perf_counter()
print(f'Terminated in {round(end - start, 2)} seconds')
glutMainLoop() 

我在 glutSwapBuffers() 之后的函数 showScreen 中收到此错误

freeglut (foo): Fatal error in program.  NULL display callback not permitted in GLUT 3.0+ or freeglut 2.0.1+

这个错误是什么意思以及如何解决它?

【问题讨论】:

    标签: python opengl glut pyopengl


    【解决方案1】:

    该错误几乎可以告诉您问题所在。您没有提供显示功能。这是你写的:

    glutDisplayFunc(showScreen([300, 400], stringa, x, len(stringa)-1, 0))
    

    它的作用是调用函数showScreen,然后将此调用返回的内容传递给glutDisplayFunction。您的 showScreen 函数不会返回任何内容。

    这不是你想要的。您必须使用lambda 来捕获要显示屏幕的参数,或者使用辅助函数。例如。这个

    glutDisplayFunc(lambda: showScreen([300, 400], stringa, x, len(stringa)-1, 0))
    

    但是考虑到您将视口和其他参数传递给 showScreen 的事实,这不太可能是您真正想要的!

    【讨论】:

      【解决方案2】:

      错误表示您调用了glutDisplayFunc,但没有提供函数作为第一个参数。

      我知道它看起来和你一样,但仔细看看这一行:

      glutDisplayFunc(showScreen(...))

      会发生什么:

      1. 首先,调用showScreen(...)并返回None
      2. 此值用作 glutDisplayFunc 的第一个参数:glutDisplayFunc(None)
      3. 发生错误,因为 glutDisplayFunc 需要一个函数但得到了None

      glutIdleFunc 也会发生同样的错误。

      要解决这两个问题,请给 glutDisplayFunc 和 glutIdleFunc 只是函数的名称:

      glutDisplayFunc(showScreen)
      glutIdleFunc(showScreen)
      

      现在还有一个问题,因为 glut 不会向showScreen 提供任何参数。它将像这样运行它:showScreen()

      这是一个问题,因为您的 showScreen 函数需要几个参数。但它实际上需要用 none 定义:def showScreen(): 这意味着您必须以其他方式提供这些变量。

      datenwolf 建议您创建一个不接受任何参数并且只运行showScreen(...)的新函数

      def doShowScreen():
        showScreen(showScreen([300, 400], stringa, x, len(stringa)-1, 0))
      
      glutDisplayFunc(doShowScreen)
      glutIdleFunc(doShowScreen)
      
      

      【讨论】:

      • 好的,我将参数转换为全局变量,这修复了崩溃。但是,窗口上仍然只显示一些行,如图所示
      • 我对龙曲线不是很熟悉,你确定你的视口正在捕捉整个图像吗?当您扩展视口以包含负坐标时会发生什么? (-500,-500, 1000, 1000)
      • 谢谢 我注意到视口和 glOrtho() 设置不正确,我将它们的参数更改为 glViewport(0, 0, 1200, 900) (用于分辨率)和 glOrtho(0.0, 1200 , 0.0, 900, 0.0, 1.0) 完全一样。
      猜你喜欢
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-08
      相关资源
      最近更新 更多