diff --git a/panda/src/glstuff/glGraphicsBuffer_src.cxx b/panda/src/glstuff/glGraphicsBuffer_src.cxx index 3a02edf97c..9a38590b8b 100644 --- a/panda/src/glstuff/glGraphicsBuffer_src.cxx +++ b/panda/src/glstuff/glGraphicsBuffer_src.cxx @@ -640,10 +640,23 @@ rebuild_bitplanes() { if (_have_any_color || have_any_depth) { // Clear if the fbo was just created, regardless of the clear settings per - // frame. + // frame. However, we don't do this for textures, which may have useful + // contents that need to be preserved. if (_initial_clear) { - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + GLbitfield mask = 0; + if (_rb[RTP_color]) { + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + mask |= GL_COLOR_BUFFER_BIT; + } + if (_rb[RTP_depth]) { + mask |= GL_DEPTH_BUFFER_BIT; + } + if (_rb[RTP_depth_stencil]) { + mask |= GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT; + } + if (mask != 0) { + glClear(mask); + } } #ifndef OPENGLES_1 } else if (glgsg->_supports_empty_framebuffer) { @@ -808,6 +821,10 @@ bind_slot(int layer, bool rb_resize, Texture **attach, RenderTexturePlane slot, _fb_properties.setup_color_texture(tex); } + if (slot == RTP_color && !tex->has_clear_color()) { + tex->set_clear_color(LColor(0, 0, 0, 1)); + } + _textures.push_back(tex); TextureContext *tc = tex->prepare_now(glgsg->get_prepared_objects(), glgsg);