0

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

我正在使用英特尔 hd 3000 和 Ubuntu 12.10 的机器上测试这个应用程序,驱动程序是默认的英特尔驱动程序。到目前为止,除了应用了多个后处理过滤器之外,一切都在工作。

该过程是这样的:

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

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

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

在屏幕上渲染结果。

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

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

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

有人能在英特尔视频卡上编写类似的代码吗?我对问题可能是什么已经没有想法了。

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

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

   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)
4

0 回答 0