окно cra sh и частичный рендеринг в opengl - PullRequest
1 голос
/ 20 апреля 2020

При выполнении не все строки печатаются в окне. Кроме того окно вылетает после glutSwapBuffers () в функции showScreen. Вот изображение: 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() 

Я получаю эту ошибку в функции showScreen после glutSwapBuffers ()

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

Что означает и как эта ошибка это исправить?

Ответы [ 2 ]

4 голосов
/ 20 апреля 2020

Ошибка в значительной степени говорит вам, в чем проблема. Вы не предоставили функцию отображения. Вот что вы написали:

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, очень маловероятно, что это действительно то, что вам нужно!

1 голос
/ 20 апреля 2020

Ошибка означает, что вы вызвали glutDisplayFunc, но не указали функцию в качестве первого аргумента.

Я знаю, что это выглядит так же, как и вы, но более внимательно посмотрите на эту строку:

glutDisplayFunc(showScreen(...))

Вот что происходит:

  1. first, showScreen(...) вызывается и возвращает None
  2. Это значение используется в качестве первого аргумента glutDisplayFun c: glutDisplayFunc(None)
  3. Произошла ошибка, поскольку glutDisplayFun c ожидает функцию, но получила None

Та же ошибка произойдет и с glutIdleFun c.

Чтобы исправить это для них обоих, задайте glutDisplayFun c и glutIdleFun c просто имя функции:

glutDisplayFunc(showScreen)
glutIdleFunc(showScreen)

Теперь все еще существует проблема, поскольку glut не предоставит никаких аргументов для showScreen , Он будет работать так: showScreen().

Это проблема, потому что ваша функция showScreen ожидает пару аргументов. Но на самом деле его нужно определить без него: def showScreen(): Это означает, что вам придется предоставить эти переменные другим способом.

datenwolf предлагает вам создать новую функцию, которая не принимает аргументов и просто запускает showScreen(...)

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

glutDisplayFunc(doShowScreen)
glutIdleFunc(doShowScreen)

...