簡體   English   中英

從OpenGL glReadPixels獲取數據(使用Pyglet)

[英]Get Data from OpenGL glReadPixels(using Pyglet)

我在應用程序上的Python中使用Pyglet(和OpenGL),我正在嘗試使用glReadPixels獲取一組像素的RGBA值。 據我了解,OpenGL將數據作為打包的整數返回,因為這是將它們存儲在硬件上的方式。 但是出於明顯的原因,我想將其轉換為正常格式進行處理。 根據一些閱讀,我提出了這個建議: http : //dpaste.com/99206/ ,但是它失敗並出現IndexError。 我將如何去做呢?

您必須首先創建正確類型的數組,然后將其傳遞給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]

現在,每當您在應用程序窗口中的某個位置單擊時,您都應該在鼠標光標下方看到像素的顏色代碼。

您可以使用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有所不同。 我猜想必須更改以上代碼以將緩沖區用作第七個參數(符合較少的pythonic pyglet樣式)。

我可以使用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(...)的輸出與我在Window中看到的不同。 (錯過了多采樣緩沖區?)

如果您閱讀了鏈接的片段,則可以理解,獲取“正常”值的最簡單方法是按正確的順序訪問數組。
這段代碼看起來像應該做的那樣。 如果不是,請對其進行調試,然后查看問題所在。

在進一步的審查中,我認為我的原始代碼基於某些C特定代碼,因為該數組只是一個指針,因此可以工作,因此使用指針算術可以得到特定的字節,這顯然不會轉換為Python。 是否有人使用另一種方法提取數據(我假設這只是對數據進行位移的問題)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM