Opengl 我的代码在异步运行时产生错误,但它是同步运行的

Opengl 我的代码在异步运行时产生错误,但它是同步运行的,opengl,nim-lang,Opengl,Nim Lang,我正在用OpenGL和Nim制作一个3d视频游戏。 最初,我用代码在display函数中绘制一些立方体,但它使用了{.cdecl.}pragma,这意味着我无法访问相机位置等外部变量。我切换到一个空的显示函数,改为一个异步while循环。但是,当我编译并运行该程序时,它生成了一个GLError,并显示消息“Error:unhandled exception:OpenGl Error:invalid operation[GLError]”。有人知道为什么会这样吗 我的代码: import open

我正在用OpenGL和Nim制作一个3d视频游戏。 最初,我用代码在display函数中绘制一些立方体,但它使用了{.cdecl.}pragma,这意味着我无法访问相机位置等外部变量。我切换到一个空的显示函数,改为一个异步while循环。但是,当我编译并运行该程序时,它生成了一个GLError,并显示消息“Error:unhandled exception:OpenGl Error:invalid operation[GLError]”。有人知道为什么会这样吗

我的代码:

import opengl, opengl/[glut, glu]
import os, strutils, threadpool
# import camera, controller, dataprotocol, inventory

proc display() {.cdecl.} =
    discard

proc reshape(width: GLsizei, height: GLsizei) {.cdecl.} =
  if height == 0:
    return

  glViewport(0, 0, width, height)

  glMatrixMode(GL_PROJECTION)
  glLoadIdentity()
  
  gluPerspective(45.0, width / height, 0.1, 100.0)

proc drawAll(xpos: float, ypos: float, zpos: float): void =
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)
  glMatrixMode(GL_MODELVIEW)
  glLoadIdentity()
  glTranslatef(1.55+xpos, -1.75+ypos, -7.0+zpos)

  glBegin(GL_TRIANGLES)

  # Top face
  glColor3f(0.0, 1.0, 0.0)  # Green
  glVertex3f(1.0, 1.0, -1.0)
  glVertex3f(-1.0, 1.0, -1.0)
  glVertex3f(-1.0, 1.0,  1.0)
  glVertex3f( 1.0, 1.0,  1.0)
  glVertex3f( 1.0, 1.0, -1.0)
  glVertex3f(-1.0, 1.0,  1.0)

  # Bottom face
  glColor3f(139.0/256.0, 69.0/256.0, 19.0/256.0)  # Brown
  glVertex3f( 1.0, -1.0,  1.0)
  glVertex3f(-1.0, -1.0,  1.0)
  glVertex3f(-1.0, -1.0, -1.0)
  glVertex3f( 1.0, -1.0, -1.0)
  glVertex3f( 1.0, -1.0,  1.0)
  glVertex3f(-1.0, -1.0, -1.0)

  # Front face
  glColor3f(139.0/256.0, 69.0/256.0, 19.0/256.0)  # Brown
  glVertex3f( 1.0,  1.0, 1.0)
  glVertex3f(-1.0,  1.0, 1.0)
  glVertex3f(-1.0, -1.0, 1.0)
  glVertex3f( 1.0, -1.0, 1.0)
  glVertex3f( 1.0,  1.0, 1.0)
  glVertex3f(-1.0, -1.0, 1.0)

  # Back face
  glColor3f(139.0/256.0, 69.0/256.0, 19.0/256.0)  # Brown
  glVertex3f( 1.0, -1.0, -1.0)
  glVertex3f(-1.0, -1.0, -1.0)
  glVertex3f(-1.0,  1.0, -1.0)
  glVertex3f( 1.0,  1.0, -1.0)
  glVertex3f( 1.0, -1.0, -1.0)
  glVertex3f(-1.0,  1.0, -1.0)

  # Left face
  glColor3f(139.0/256.0, 69.0/256.0, 19.0/256.0)  # Brown
  glVertex3f(-1.0,  1.0,  1.0)
  glVertex3f(-1.0,  1.0, -1.0)
  glVertex3f(-1.0, -1.0, -1.0)
  glVertex3f(-1.0, -1.0,  1.0)
  glVertex3f(-1.0,  1.0,  1.0)
  glVertex3f(-1.0, -1.0, -1.0)

  # Right face
  glColor3f(139.0/256.0, 69.0/256.0, 19.0/256.0) # Brown
  glVertex3f(1.0,  1.0, -1.0)
  glVertex3f(1.0,  1.0,  1.0)
  glVertex3f(1.0, -1.0,  1.0)
  glVertex3f(1.0, -1.0, -1.0)
  glVertex3f(1.0,  1.0, -1.0)
  glVertex3f(1.0, -1.0,  1.0)

  glEnd()

  glutSwapBuffers()

# var blocks = string(open("blocks.bmc").readAll).split(";")
# Commented out because not used yet

# glutInit()
glutInitDisplayMode(GLUT_DOUBLE)
glutInitWindowSize(640, 480)
glutInitWindowPosition(50, 50)
discard glutCreateWindow("BlueMC")

if paramCount() == 1 and paramStr(1) == "-fullscreen":
  glutFullScreen()

glutSetCursor(GLUT_CURSOR_CROSSHAIR)

glutDisplayFunc(display)
glutReshapeFunc(reshape)

loadExtensions()

glClearColor(GLFloat(172.0/255.0), GLFloat(246.0/255.0), GLFloat(246.0/255.0), GLFloat(1.0))
glClearDepth(1.0)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)
glShadeModel(GL_SMOOTH)
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)

proc eventloop(): void {.gcsafe.} =
  while true:
    drawAll(0.0, 0.0, 0.0)

spawn eventloop()
glutMainLoop()

Nim的
spawn
语句将在不同的线程中执行您的过程。在OpenGL中,当前上下文是每个线程的属性,每次只能将OpenGL conetxt设置为单个线程的当前。您的构造无法与OpenGL一起使用。然而,问题的根本原因是您使用了非常过时的GLUT框架,它迫使您使用一些反向控制流来执行渲染循环。如果您想使用更现代的框架,如GLFW、SDL或其他许多框架,您可以实现事件和渲染循环,而无需任何这些麻烦。

Nim的
spawn
语句将在不同的线程中执行您的过程。在OpenGL中,当前上下文是每个线程的属性,每次只能将OpenGL conetxt设置为单个线程的当前。您的构造无法与OpenGL一起使用。然而,问题的根本原因是您使用了非常过时的GLUT框架,它迫使您使用一些反向控制流来执行渲染循环。如果您使用更现代的框架,如GLFW、SDL或其他许多框架,那么您可以实现事件和渲染循环,而无需任何这些麻烦