Как мне прочитать moderngl fbo (объект буфера кадра) обратно в массив numpy? - PullRequest
2 голосов
/ 11 июля 2019

У меня есть один из 2 FBO, которые я использовал для проверки некоторых вычислений в glsl, и мне нужно прочитать данные текстуры (из dtype = 'f4') обратно в массив для дальнейших вычислений.Я не нашел ничего в документации, которая объясняет, как это сделать.Любая помощь?

Я создаю текстуры с этим

self.texturePing = self.ctx.texture( (width, height), 4, dtype='f4')
self.texturePong = self.ctx.texture( (width, height), 4, dtype='f4')

И я обрабатываю их так:

def render(self, time, frame_time):
        self.line_texture.use(0)
        self.transform['lineImg'].value = 0
        for _ in range (2):
            self.fbo2.use()
            self.texturePing.use(1)
            self.transform['prevData'].value = 1

            self.process_vao.render(moderngl.TRIANGLE_STRIP)

            #this rendered to texturePong 
            self.fbo1.use() #texture Ping


            self.texturePong.use(1)
            self.transform['prevData'].value = 1                
            self.process_vao.render(moderngl.TRIANGLE_STRIP)

        #stop drawing to the fbo and draw to the screen
        self.ctx.screen.use()
        self.ctx.clear(1.0, 1.0, 1.0, 0.0) #might be unnecessary   
        #tell the canvas to use this as the final texture 
        self.texturePing.use(3)
        self.canvas_prog['Texture'].value = 3
        #bind the ping texture as the Texture in the shader
        self.canvas_vao.render(moderngl.TRIANGLE_STRIP)

        # this looks good but how do I read texturePong back into a numpy array??

Ответы [ 3 ]

0 голосов
/ 11 июля 2019

Свяжите кадровый буфер и используйте glReadPixels, чтобы получить буфер.w и h - это ширина и высота буфера, формат GL_RGBA и тип GL_FLOAT:

image_buffer = glReadPixels(0, 0, w, h, GL_RGBA, GL_FLOAT)

Или привяжите текстуру и используйте glGetTexImage для перехода по текстуре изображения:

image_buffer = glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_FLOAT)

Ящик массива из буфера (numpy.frombuffer) и numpy.reshape массива (ш, ч, 4):

image = np.frombuffer(image_buffer, dtype=np.`f4`).reshape(w, h, 4)
0 голосов
/ 13 июля 2019

Вы можете прочитать содержимое фреймбуфера с помощью fbo.read.

Вы можете превратить буфер в пустой массив с помощью np.frombuffer

Пример:

raw = self.fbo1.read(components=4, dtype='f4') # RGBA, floats
buf = np.frombuffer(raw, dtype='f4')
0 голосов
/ 11 июля 2019

Используйте glGetTexImage (или, предпочтительно, glGetTextureImage), чтобы скопировать данные в буфер (из текстуры, которую вы используете для своих цветовых данных).

https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetTexImage.xhtml

glGetTextureImage(textureToReadFrom, 0, GL_RGBA, GL_FLOAT, bufferSize, bufferPointer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...