فهرست منبع

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

Lasse Öörni 14 سال پیش
والد
کامیت
4a2e1b4456
2فایلهای تغییر یافته به همراه18 افزوده شده و 48 حذف شده
  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)
     if (!index)
     {
     {
-        // Viewport has been reset
+        // Reset viewport and scissor test
         IntVector2 rtSize = GetRenderTargetDimensions();
         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());
         Graphics::GetLinearDepthFormat());
     
     
     RenderSurface* renderTarget = screenBuffers_.Size() ? screenBuffers_[0]->GetRenderSurface() : renderTarget_;
     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)
     if (renderMode_ == RENDER_PREPASS)
+    {
         graphics_->SetRenderTarget(0, normalBuffer);
         graphics_->SetRenderTarget(0, normalBuffer);
+        graphics_->SetDepthStencil(depthStencil);
+        graphics_->SetViewport(viewRect_);
+        graphics_->Clear(CLEAR_DEPTH | CLEAR_STENCIL);
+        
+        if (!hwDepth)
+            graphics_->SetRenderTarget(1, depthBuffer);
+    }
     else
     else
     {
     {
         graphics_->SetRenderTarget(0, renderTarget);
         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(1, albedoBuffer);
         graphics_->SetRenderTarget(2, normalBuffer);
         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())
     if (!gbufferQueue_.IsEmpty())
     {
     {
         // Render G-buffer batches
         // Render G-buffer batches
@@ -1159,24 +1157,9 @@ void View::RenderBatchesDeferred()
     }
     }
     else
     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(1);
         graphics_->ResetRenderTarget(2);
         graphics_->ResetRenderTarget(2);
         graphics_->ResetRenderTarget(3);
         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())
     if (!lightQueues_.Empty())
@@ -1215,20 +1198,10 @@ void View::RenderBatchesDeferred()
     if (renderMode_ == RENDER_PREPASS)
     if (renderMode_ == RENDER_PREPASS)
     {
     {
         // Clear destination rendertarget with fog color
         // 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_->SetRenderTarget(0, renderTarget);
         graphics_->SetDepthStencil(depthStencil);
         graphics_->SetDepthStencil(depthStencil);
         graphics_->SetViewport(viewRect_);
         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())
     if (!baseQueue_.IsEmpty())