多个帧缓冲区和纹理不适用于英特尔驱动程序

时间:2013-05-11 04:53:28

标签: opengl intel framebuffer

我正在使用PyOpengl和PySide编写应用程序。我的主机安装了ubuntu和nvidia卡(专有驱动程序),前提是告诉应用程序在此设置下正常工作。

我正在使用intel hd 3000和Ubuntu 12.10的计算机上测试此应用程序,驱动程序是默认的intel驱动程序。到目前为止,除了应用多个后处理过滤器之外,一切都在进行。

这个过程就是这样:

渲染场景并使用帧缓冲对象(称为fb0)输出颜色纹理(texture0)。

通过绑定上一步中生成的纹理来渲染第一个后处理效果。处理后的颜色输出通过另一个帧缓冲区(fb1)保存在另一个纹理(extratexture1)中。

使用新的颜色纹理(extratexture2和fb2)渲染另一种后处理效果。

在屏幕上渲染结果。

我获得的是白色屏幕(也许是我的背景颜色)。

如果我删除最后一步并渲染extratexture1,我会得到正确的结果。如果我只删除第二步并渲染extratexture2,我会得到正确的结果。因此问题不应该在纹理初始化代码中。

这个驱动程序一次不支持超过2个帧缓冲区(默认值为1)。或者可能无法重置一些重要的状态。

是否有人能够在intel视频卡上编写类似的东西?我对这个问题的看法已经不多了。

我添加了一些示例代码来解决任何错误:

在初始化时初始化帧缓冲区和纹理。每次调整大小时都会重新生成纹理。

   self.fb0, self.fb2, self.fb1 = glGenFramebuffers(3)
   # Creation of texture0

   glDrawBuffers(1, np.array([GL_COLOR_ATTACHMENT0], dtype='uint32'))

   # Creation of extratexture1
   # Creation of extratexture2

创建每个纹理:

def create_color_texture(fb, width, height):
    # Simple wrapper for glGenTexture and glTexImage2D
    texture = Texture(GL_TEXTURE_2D, width, height, GL_RGB, GL_RGB,
                      GL_UNSIGNED_BYTE)

    # Set some parameters
    texture.set_parameter(GL_TEXTURE_MAG_FILTER, GL_NEAREST)
    texture.set_parameter(GL_TEXTURE_MIN_FILTER, GL_LINEAR)        

    glBindFramebuffer(GL_FRAMEBUFFER, fb)
    glViewport(0, 0, width, height)
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
                           texture.id, 0)
    return texture

将纹理绘制到屏幕的代码:

def render(self, fb, textures):
    # We need to render to a quad
    glBindFramebuffer(GL_FRAMEBUFFER, fb)
    glViewport(0, 0, self.widget.width(), self.widget.height())
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glUseProgram(self.quad_program)

    qd_id = glGetUniformLocation(self.quad_program, "rendered_texture")
    # Setting up the texture
    glActiveTexture(GL_TEXTURE0)
    textures['color'].bind()
    # Set our "rendered_texture" sampler to user Texture Unit 0
    glUniform1i(qd_id, 0)

    # Set resolution
    glUniform2f(glGetUniformLocation(self.quad_program, 'resolution'), self.widget.width(), self.widget.height())
    # Set gamma value
    glUniform1f(glGetUniformLocation(self.quad_program, 'gamma'), self.gamma)

    # Let's render a quad
    quad_data = np.array([-1.0, -1.0, 0.0,
                          1.0, -1.0, 0.0,
                          -1.0,  1.0, 0.0,
                          -1.0,  1.0, 0.0,
                          1.0, -1.0, 0.0,
                          1.0,  1.0, 0.0],
                         dtype='float32')

    vboquad = vbo.VBO(quad_data)
    vboquad.bind()

    glVertexPointer(3, GL_FLOAT, 0, None)        
    glEnableClientState(GL_VERTEX_ARRAY)

    # draw "count" points from the VBO
    glDrawArrays(GL_TRIANGLES, 0, 6)

    vboquad.unbind()
    glDisableClientState(GL_VERTEX_ARRAY)

0 个答案:

没有答案