我正在使用 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)