使用Glut和OpenGL以及Python捕获屏幕

使用Glut和OpenGL以及Python捕获屏幕,python,opengl,glut,Python,Opengl,Glut,我正在使用Python和OpenGL进行一些与物理系统相关的计算,然后显示它们,并能够操作图像旋转它,转换它 我不是一个专业的程序员,我没有使用OpenGL的经验,我在尝试得到我想要的东西时遇到了一些问题。我希望能够将获得的窗口保存为视频文件中的输出,为此,我看到了使用glReadPixels捕获每一帧,然后将它们全部放在一起的可能性 我现在正在使用类似于以下代码的东西,我希望能够将帧保存到图像中,但是,尽管我已经能够使用glReadPixels将像素保存到数组中,但我不知道在哪里,也不知道如何

我正在使用Python和OpenGL进行一些与物理系统相关的计算,然后显示它们,并能够操作图像旋转它,转换它

我不是一个专业的程序员,我没有使用OpenGL的经验,我在尝试得到我想要的东西时遇到了一些问题。我希望能够将获得的窗口保存为视频文件中的输出,为此,我看到了使用
glReadPixels
捕获每一帧,然后将它们全部放在一起的可能性

我现在正在使用类似于以下代码的东西,我希望能够将帧保存到图像中,但是,尽管我已经能够使用
glReadPixels
将像素保存到数组中,但我不知道在哪里,也不知道如何调用我定义为
captureScreen
的函数。我应该怎么做才能得到我想要的输出

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from PIL import Image
from scipy import *
import numpy as np
import random as rnd

def captureScreen(file_):

    glPixelStorei(GL_PACK_ALIGNMENT, 1)
    data = glReadPixels(0, 0, 800, 800, GL_RGBA, GL_UNSIGNED_BYTE)
    image = Image.fromstring("RGBA", (800, 800), data)
    image.save(file_, 'png')

def main():  

     glutInit(sys.argv)
     glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
     glutInitWindowPosition(0, 0)
     glutInitWindowSize(800, 800)

     glutCreateWindow ("Test")

     glEnable(GL_DEPTH_TEST)
     glDepthMask(GL_TRUE)
     glEnable(GL_BLEND)
     glEnable(GL_TEXTURE_2D)
     glEnable(GL_COLOR_MATERIAL)
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
     glPointSize( 6.0 )
     glLineWidth( 2.0 )
     glEnable(GL_POINT_SMOOTH)
     glEnable(GL_LINE_SMOOTH)
     glHint(GL_LINE_SMOOTH_HINT, GL_NICEST)
     glEnable(GL_POLYGON_SMOOTH)
     glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST)

     glEnableClientState(GL_VERTEX_ARRAY)
     glEnableClientState(GL_COLOR_ARRAY)

     glClearColor(0.0, 0.0, 0.0, 0.0)

     glutFullScreen()
     glutKeyboardFunc(keyboard)
     glutIdleFunc(dynamics)
     glutDisplayFunc(display)
     glutMouseFunc(mouse)


     glutMainLoop()


if __name__ == '__main__':

     main()
键盘、显示器、动力学和鼠标是以前定义的函数。

您可以在glutSwapBuffers()之后调用glReadPixels()

或者就在之前:

glReadBuffer(GL_BACK)
glReadPixels(...)
glutSwapBuffers()

因此,captureScreen()应该从“display”函数调用,该函数可能是调用glutSwapBuffers()的函数。

您的意思是在
glutSwapBuffers
之前?调用
glutSwapBuffers()
后,后缓冲区(从中读取的
glReadPixels()
内容)的内容将被取消定义。非常感谢,它非常有用。
glReadBuffer(GL_BACK)
glReadPixels(...)
glutSwapBuffers()