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