pyopengl纹理_如何在PyOpenGL中将纹理复制到pbo中?

在一段时间愉快地使用PyOpenGL后,我现在被严重卡住了。我正在研究一个Python软件包,该软件包允许我使用GLSL着色器和OpenCL程序进行图像处理,使用纹理作为标准化方式将数据导入和导出GLSL着色器和OpenCL程序。

一切正常,但我无法将纹理复制到pbo(像素缓冲区对象)。

我使用pbo将我的纹理数据导入/导出OpenCL,并且在PyOpenCL中工作得很好,速度很快:我可以从我的OpenCL输出

pbo到一个纹理并显示它,我也可以从CPU加载数据到一个pbo。但我绝望地坚持试图用已经在GPU上的纹理数据填充我的pbo,这是我需要做的,以将我的GLSL着色器生成的图像加载到OpenCL中以进行进一步处理。

我已阅读了两种方法来做到这一点:

变体1绑定pbo,绑定纹理并使用glGetTexImage()

变体2将纹理附加到帧缓冲区对象,绑定fbo和pbo并使用glReadPixels()

我还读到,glReadPixels()和glGetTexImage()的PyOpenGL版本在使用绑定pbo时应该使用的'Null'指针有问题,因此我使用OpenGL.raw.GL变体。

但在这两种情况下,我都会收到'无效操作'错误,而且我真的不明白我做错了什么。以下两个版本

我的pixelbuffer Python类的load_texture()方法,我希望我没有将它们剥离得太远...

变体1:

def _load_texture(self, texture):

glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, self.id)

glEnable(texture.target)

glActiveTexture(GL_TEXTURE0_ARB)

glBindTexture(texture.target, texture.id)

OpenGL.raw.GL.glGetTexImage(texture.target, 0, texture.gl_imageformat,

texture.gl_dtype, ctypes.c_void_p(0))

glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0)

glDisable(texture.target)变体2:

def _load_texture(self, texture):

fbo = FrameBufferObject.from_textures([texture])

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,

texture.target, texture.id, 0)

glReadBuffer(GL_COLOR_ATTACHMENT0)

glBindFramebuffer(GL_FRAMEBUFFER, fbo.id)

glBindBuffer(GL_PIXEL_PACK_BUFFER, self.id)

OpenGL.raw.GL.glReadPixels(0, 0, self.size[0], self.size[1],

texture.gl_imageformat, texture.gl_dtype,

ctypes.c_void_p(0))

glBindBuffer(GL_PIXEL_PACK_BUFFER, 0)

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,

GL_TEXTURE_RECTANGLE_ARB, 0, 0)

glBindFramebuffer(GL_FRAMEBUFFER, 0)编辑(添加一些关于我的pbo的错误和初始化的信息):

我为变体1获得的错误是:

OpenGL.error.GLError: GLError(

err = 1282,

description = 'invalid operation',

baseOperation = glGetTexImage,

cArguments = (

GL_TEXTURE_RECTANGLE_ARB,

0,

GL_RGBA,

GL_UNSIGNED_BYTE,

c_void_p(None),

)我正在初始化我的pbo,像这样:

self.usage = usage

if isinstance(size, tuple):

size = size[0] * size[1] * self.imageformat.planecount

bytesize = self.imageformat.get_bytesize_per_plane() * size

glBindBuffer(self.arraytype, self.id)

glBufferData(self.arraytype, bytesize, None, self.usage)

glBindBuffer(self.arraytype, 0)'self.arraytype'是GL_ARRAY_BUFFER,self.usage我试过所有的可能性,以防万一,但GL_STREAM_READ似乎是我使用类型最合乎逻辑的。

我通常使用的大小是1024乘1024,4个平面,每个平面1个字节,因为它是未整除的整数。当从主机传输像素数据时,这工作正常。

此外,我在Kubuntu 11.10上使用NVIDIA GeForce GTX 580,在GPU上使用3Gb内存,并使用专有驱动程序295.33

我错过了什么?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值