Browse Source

Allocate a screen buffer if rendering to texture in OpenGL deferred mode, and texture format is not RGBA.
Immediately clear all screen buffers when switching rendering mode.

Lasse Öörni 14 years ago
parent
commit
845b38c2b4
2 changed files with 11 additions and 2 deletions
  1. 1 0
      Engine/Graphics/Renderer.cpp
  2. 10 2
      Engine/Graphics/View.cpp

+ 1 - 0
Engine/Graphics/Renderer.cpp

@@ -350,6 +350,7 @@ void Renderer::SetRenderMode(RenderMode mode)
                 graphics_->GetTripleBuffer(), 1);
         }
         
+        ResetBuffers();
         renderMode_ = mode;
         shadersDirty_ = true;
     }

+ 10 - 2
Engine/Graphics/View.cpp

@@ -1248,7 +1248,9 @@ void View::AllocateScreenBuffers()
     unsigned neededBuffers = 0;
     #ifdef USE_OPENGL
     // Due to FBO limitations, in OpenGL deferred modes need to render to texture first and then blit to the backbuffer
-    if (renderMode_ != RENDER_FORWARD && !renderTarget_)
+    // Also, if rendering to a texture with deferred rendering, it must be RGBA to comply with the rest of the buffers.
+    if (renderMode_ != RENDER_FORWARD && (!renderTarget_ || (renderMode == RENDER_DEFERRED &&
+        renderTarget_->GetParentTexture()->GetFormat() != Graphics::GetRGBAFormat())))
         neededBuffers = 1;
     #endif
     
@@ -1260,9 +1262,15 @@ void View::AllocateScreenBuffers()
     if (postProcessPasses)
         neededBuffers = Min((int)postProcessPasses, 2);
     
+    unsigned format = Graphics::GetRGBFormat();
+    #ifdef USE_OPENGL
+    if (renderMode_ == RENDER_DEFERED)
+        format = Graphics::GetRGBAFormat();
+    #endif
+    
     // Allocate screen buffers with filtering active in case the post-processing effects need that
     for (unsigned i = 0; i < neededBuffers; ++i)
-        screenBuffers_.Push(renderer_->GetScreenBuffer(rtSize_.x_, rtSize_.y_, Graphics::GetRGBAFormat(), true));
+        screenBuffers_.Push(renderer_->GetScreenBuffer(rtSize_.x_, rtSize_.y_, format, true));
 }
 
 void View::BlitFramebuffer()