python - Render to screen and to FBO give different result -
i wrote programme render square texture screen , fbo. believe rendering result should same both case, output destination different. surprisingly, gives me different result.
for first image, straight output screen. good, without problems. sec image, rendered fbo texture, , render texture screen. in case, output totally messed up, seems output contain up-left corner of image.
related code is:
def render(self): gl.glclear(gl.gl_color_buffer_bit | gl.gl_depth_buffer_bit) gl.glbindframebuffer(gl.gl_framebuffer, self._fbids[1]) gl.glbindtexture(gl.gl_texture_2d, self._texids[0]) gl.gluseprogram(0) self.drawquad2() gl.glbindframebuffer(gl.gl_framebuffer, 0) gl.glbindtexture(gl.gl_texture_2d, self._texids[1]) # second, messed output. # gl.glbindtexture(gl.gl_texture_2d, self._texids[0]) # first, normal output. gl.gluseprogram(0) self.drawquad2() def drawquad2(self): gl.glbegin(gl.gl_quads) gl.gltexcoord2f(0, 1) gl.glvertex2f(-1, 1) gl.gltexcoord2f(1, 1) gl.glvertex2f(1, 1) gl.gltexcoord2f(1, 0) gl.glvertex2f(1, -1) gl.gltexcoord2f(0, 0) gl.glvertex2f(-1, -1) gl.glend() gl.glflush() def setuptexture(self, num, rawstr, width, height): texids = gl.glgentextures(num) tid in texids: print 'texture binded %s' % tid gl.glbindtexture(gl.gl_texture_2d, tid) gl.glteximage2d( gl.gl_texture_2d, 0, gl.gl_rgba, width, height, 0, gl.gl_rgba, gl.gl_unsigned_byte, rawstr) gl.gltexparameteri( gl.gl_texture_2d, gl.gl_texture_mag_filter, gl.gl_nearest) gl.gltexparameteri( gl.gl_texture_2d, gl.gl_texture_min_filter, gl.gl_nearest) gl.glenable(gl.gl_texture_2d); homecoming texids def setupframebuffer(self, num, texids): assert(len(texids) == num) fbids = gl.glgenframebuffers(num) in range(len(fbids)): print 'framebuffer binded %s texture %s' % (fbids[i], texids[i]) gl.glbindframebuffer(gl.gl_framebuffer, fbids[i]) gl.glframebuffertexture2d( gl.gl_framebuffer, gl.gl_color_attachment0, gl.gl_texture_2d, texids[i], 0) homecoming fbids def reshape(self, w, h): if not h: homecoming print 'reshape. w:%s, h:%s' % (w, h) gl.glmatrixmode(gl.gl_projection) gl.glloadidentity() gl.glviewport(0, 0, w, h) gl.glortho(-1, 1, -1, 1, -1, 1) gl.glmatrixmode(gl.gl_modelview) gl.glloadidentity()
you must utilize glviewport
function tell opengl size of target window shall address drawing operations. when switch render fbo, must phone call glviewport
makes sense target texture; target texture itself. when switching render window phone call glviewport
target window size.
if destination viewport larger destination framebuffer results in zoom-in.
python opengl framebuffer pyopengl
No comments:
Post a Comment