从OpenGL glReadPixels获取数据(使用Pyglet)

2024-09-25 14:22:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个应用程序上使用Python中的Pyglet(和OpenGL),我试图使用glReadPixels来获取一组像素的RGBA值。我的理解是OpenGL将数据作为压缩整数返回,因为这就是它们在硬件上的存储方式。不过,出于明显的原因,我想让它成为一个正常的工作格式。基于一些阅读,我提出了这个:http://dpaste.com/99206/,但是它失败了,出现了索引器错误。我该怎么做呢?


Tags: 数据com应用程序http硬件格式方式原因
3条回答

必须首先创建正确类型的数组,然后将其传递给glReadPixels:

a = (GLuint * 1)(0)
glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_INT, a)

要对此进行测试,请在Pyglet“opengl.py”示例中插入以下内容:

@window.event
def on_mouse_press(x, y, button, modifiers):
    a = (GLuint * 1)(0)
    glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_INT, a)
    print a[0]

现在,每当您在应用程序窗口中单击某个位置时,您应该会看到鼠标光标下像素的颜色代码。

我可以使用glReadPixels(...)获得整个帧缓冲区,然后使用PIL将其写入文件:

# Capture image from the OpenGL buffer
buffer = ( GLubyte * (3*window.width*window.height) )(0)
glReadPixels(0, 0, window.width, window.height, GL_RGB, GL_UNSIGNED_BYTE, buffer)

# Use PIL to convert raw RGB buffer and flip the right way up
image = Image.fromstring(mode="RGB", size=(window.width, window.height), data=buffer)     
image = image.transpose(Image.FLIP_TOP_BOTTOM)

# Save image to disk
image.save('jpap.png')

我对alpha不感兴趣,但我相信你可以很容易地添加进去。

我被迫使用glReadPixels(...),而不是Pyglet代码

pyglet.image.get_buffer_manager().get_color_buffer().save('jpap.png')

因为使用save(...)的输出与我在窗口中看到的不同。(多采样缓冲区丢失?)

您可以使用PIL库,下面是我用来捕获这样一个图像的代码片段:

    buffer = gl.glReadPixels(0, 0, width, height, gl.GL_RGB, 
                             gl.GL_UNSIGNED_BYTE)
    image = Image.fromstring(mode="RGB", size=(width, height), 
                             data=buffer)
    image = image.transpose(Image.FLIP_TOP_BOTTOM)

我想包含alpha通道应该是非常直接的(可能只是用RGBA替换RGB,但我没有尝试过)。

编辑:我不知道pyglet OpenGL API与PyOpenGL API是不同的。我想必须修改上面的代码,才能使用缓冲区作为第七个参数(符合不那么pythonic的pyglet风格)。

相关问题 更多 >