Mugichoko's blog

Mugichoko’s blog

しがない研究者のプログラミングを中心としたメモ書き.

ModernGL奮闘記 (7) - バックバッファの読み込み -

今回はバックバッファに書き込まれている内容をメインメモリに読み込んで表示してみる.よく使うので.

コード

  1. ウィンドウを用意
  2. window.clear()でウィンドウ(バックバッファ)に書き込み
  3. バックバッファ (window.fbo) にある内容をメインメモリに転送
    • Method 1
      1. バイトデータを読み込み
      2. np.arrayに変換
      3. matplotlib.pyplot.imshow()で表示
    • Method 2
      1. バイトデータを読み込み
      2. PIL.Imageに変換
      3. PIL.Image.show()で表示
  4. window.swap_buffers()でModernGLのウィンドウに表示
    • 3で読み込んでいるのはバックバッファ(隠れていて見えない)
    • なので,この段階になるまでModernGLウィンドウは真っ白
import moderngl_window
from moderngl_window.conf import settings
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

settings.WINDOW["class"] = "moderngl_window.context.glfw.Window"
settings.WINDOW["gl_version"] = (4, 1)
settings.WINDOW["title"] = "Hello GLFW"
settings.WINDOW["size"] = (640, 480)

window = moderngl_window.create_window_from_settings()

while not window.is_closing:
    window.clear(0.5, 1.0, 0.25, 1.0)

    # Method 1
    raw = window.fbo.read(components=4, dtype="f4")
    buf = np.frombuffer(raw, dtype="f4")
    buf = buf.reshape((window.height, window.width, 4))
    plt.imshow(buf)
    plt.show()

    # Method 2
    raw = window.fbo.read(components=4)
    img = Image.frombytes("RGBA", window.fbo.size, raw, "raw", "RGBA")
    img.show()
    
    window.swap_buffers()
    break

結果

f:id:Mugichoko:20211117072630p:plain
Method 1の結果

f:id:Mugichoko:20211117072701p:plain
Method 2の結果