Browse Source

Cleaned up deferred rendering viewport clear code.
Fixed UI not rendering correctly if multiple main viewports exist.

Lasse Öörni 14 năm trước cách đây
mục cha
commit
4a2e1b4456
2 tập tin đã thay đổi với 18 bổ sung48 xóa
  1. 2 5
      Engine/Graphics/Direct3D9/D3D9Graphics.cpp
  2. 16 43
      Engine/Graphics/View.cpp

+ 2 - 5
Engine/Graphics/Direct3D9/D3D9Graphics.cpp

@@ -1322,12 +1322,9 @@ void Graphics::SetRenderTarget(unsigned index, RenderSurface* renderTarget)
     
     if (!index)
     {
-        // Viewport has been reset
+        // Reset viewport and scissor test
         IntVector2 rtSize = GetRenderTargetDimensions();
-        viewport_ = IntRect(0, 0, rtSize.x_, rtSize.y_);
-        
-        // Disable scissor test, needs to be re-enabled by the user
-        SetScissorTest(false);
+        SetViewport(IntRect(0, 0, rtSize.x_, rtSize.y_));
     }
 }
 

+ 16 - 43
Engine/Graphics/View.cpp

@@ -1108,33 +1108,31 @@ void View::RenderBatchesDeferred()
         Graphics::GetLinearDepthFormat());
     
     RenderSurface* renderTarget = screenBuffers_.Size() ? screenBuffers_[0]->GetRenderSurface() : renderTarget_;
-    RenderSurface* depthStencil;
+    RenderSurface* depthStencil = hwDepth ? depthBuffer->GetRenderSurface() : renderer_->GetDepthStencil(rtSize_.x_, rtSize_.y_);
     
     if (renderMode_ == RENDER_PREPASS)
+    {
         graphics_->SetRenderTarget(0, normalBuffer);
+        graphics_->SetDepthStencil(depthStencil);
+        graphics_->SetViewport(viewRect_);
+        graphics_->Clear(CLEAR_DEPTH | CLEAR_STENCIL);
+        
+        if (!hwDepth)
+            graphics_->SetRenderTarget(1, depthBuffer);
+    }
     else
     {
         graphics_->SetRenderTarget(0, renderTarget);
+        graphics_->SetDepthStencil(depthStencil);
+        graphics_->SetViewport(viewRect_);
+        graphics_->Clear(CLEAR_COLOR | CLEAR_DEPTH | CLEAR_STENCIL, farClipZone_->GetFogColor());
+        
         graphics_->SetRenderTarget(1, albedoBuffer);
         graphics_->SetRenderTarget(2, normalBuffer);
+        if (!hwDepth)
+            graphics_->SetRenderTarget(3, depthBuffer);
     }
     
-    // Hardware depth support: render to RGBA normal buffer and read hardware depth
-    if (hwDepth)
-    {
-        depthStencil = depthBuffer->GetRenderSurface();
-    }
-    // No hardware depth support: render to RGBA normal buffer and R32F depth
-    else
-    {
-        depthStencil = renderer_->GetDepthStencil(rtSize_.x_, rtSize_.y_);
-        graphics_->SetRenderTarget(renderMode_ == RENDER_PREPASS ? 1 : 3, depthBuffer);
-    }
-    
-    graphics_->SetDepthStencil(depthStencil);
-    graphics_->SetViewport(viewRect_);
-    graphics_->Clear(CLEAR_DEPTH | CLEAR_STENCIL);
-    
     if (!gbufferQueue_.IsEmpty())
     {
         // Render G-buffer batches
@@ -1159,24 +1157,9 @@ void View::RenderBatchesDeferred()
     }
     else
     {
-        // Clear destination rendertarget with fog color
-        graphics_->SetAlphaTest(false);
-        graphics_->SetBlendMode(BLEND_REPLACE);
-        graphics_->SetColorWrite(true);
-        graphics_->SetDepthTest(CMP_ALWAYS);
-        graphics_->SetDepthWrite(false);
-        graphics_->SetScissorTest(false);
-        graphics_->SetStencilTest(true, CMP_EQUAL, OP_KEEP, OP_KEEP, OP_KEEP, 0);
-        graphics_->SetRenderTarget(0, renderTarget);
         graphics_->ResetRenderTarget(1);
         graphics_->ResetRenderTarget(2);
         graphics_->ResetRenderTarget(3);
-        graphics_->SetDepthStencil(depthStencil);
-        graphics_->SetViewport(viewRect_);
-        graphics_->SetShaders(renderer_->GetVertexShader("Basic"), renderer_->GetPixelShader("Basic"));
-        graphics_->SetShaderParameter(PSP_MATDIFFCOLOR, farClipZone_->GetFogColor());
-        graphics_->ClearParameterSource(PSP_MATDIFFCOLOR);
-        DrawFullscreenQuad(camera_, false);
     }
     
     if (!lightQueues_.Empty())
@@ -1215,20 +1198,10 @@ void View::RenderBatchesDeferred()
     if (renderMode_ == RENDER_PREPASS)
     {
         // Clear destination rendertarget with fog color
-        graphics_->SetAlphaTest(false);
-        graphics_->SetBlendMode(BLEND_REPLACE);
-        graphics_->SetColorWrite(true);
-        graphics_->SetDepthTest(CMP_ALWAYS);
-        graphics_->SetDepthWrite(false);
-        graphics_->SetScissorTest(false);
-        graphics_->SetStencilTest(true, CMP_EQUAL, OP_KEEP, OP_KEEP, OP_KEEP, 0);
         graphics_->SetRenderTarget(0, renderTarget);
         graphics_->SetDepthStencil(depthStencil);
         graphics_->SetViewport(viewRect_);
-        graphics_->SetShaders(renderer_->GetVertexShader("Basic"), renderer_->GetPixelShader("Basic"));
-        graphics_->SetShaderParameter(PSP_MATDIFFCOLOR, farClipZone_->GetFogColor());
-        graphics_->ClearParameterSource(PSP_MATDIFFCOLOR);
-        DrawFullscreenQuad(camera_, false);
+        graphics_->Clear(CLEAR_COLOR, farClipZone_->GetFogColor());
     }
     
     if (!baseQueue_.IsEmpty())