Browse Source

For a slight speed gain, do not draw a GBufferFill fullscreen quad when hardware depth is available, instead just clear the diffuse buffer.

Lasse Öörni 14 years ago
parent
commit
c65998f0e3

+ 23 - 31
Engine/Graphics/View.cpp

@@ -226,6 +226,7 @@ void View::Render()
     else
     else
         graphics_->SetViewTexture(0);
         graphics_->SetViewTexture(0);
     
     
+    graphics_->SetColorWrite(true);
     graphics_->SetFillMode(FILL_SOLID);
     graphics_->SetFillMode(FILL_SOLID);
     graphics_->SetScissorTest(false);
     graphics_->SetScissorTest(false);
     graphics_->SetStencilTest(false);
     graphics_->SetStencilTest(false);
@@ -717,7 +718,6 @@ void View::RenderBatchesForward()
         // Render opaque objects' base passes
         // Render opaque objects' base passes
         PROFILE(RenderBasePass);
         PROFILE(RenderBasePass);
         
         
-        graphics_->SetColorWrite(true);
         graphics_->SetRenderTarget(0, renderTarget_);
         graphics_->SetRenderTarget(0, renderTarget_);
         graphics_->SetDepthStencil(depthStencil_);
         graphics_->SetDepthStencil(depthStencil_);
         graphics_->SetViewport(screenRect_);
         graphics_->SetViewport(screenRect_);
@@ -798,46 +798,39 @@ void View::RenderBatchesDeferred()
         // Clear and render the G-buffer
         // Clear and render the G-buffer
         PROFILE(RenderGBuffer);
         PROFILE(RenderGBuffer);
         
         
-        graphics_->SetColorWrite(true);
-        #ifdef USE_OPENGL
-        // On OpenGL, clear the diffuse and depth buffers normally
         graphics_->SetRenderTarget(0, diffBuffer);
         graphics_->SetRenderTarget(0, diffBuffer);
         graphics_->SetDepthStencil(depthBuffer);
         graphics_->SetDepthStencil(depthBuffer);
-        graphics_->Clear(CLEAR_COLOR | CLEAR_DEPTH | CLEAR_STENCIL);
-        graphics_->SetRenderTarget(1, normalBuffer);
-        #else
-        // On Direct3D9, clear only depth and stencil at first (fillrate optimization)
-        graphics_->SetRenderTarget(0, diffBuffer);
-        graphics_->SetRenderTarget(1, normalBuffer);
-        if (!graphics_->GetHardwareDepthSupport())
+        if (graphics_->GetHardwareDepthSupport())
+        {
+            graphics_->Clear(CLEAR_COLOR | CLEAR_DEPTH | CLEAR_STENCIL);
+            graphics_->SetRenderTarget(1, normalBuffer);
+        }
+        else
+        {
+            graphics_->Clear(CLEAR_DEPTH | CLEAR_STENCIL);
+            graphics_->SetRenderTarget(1, normalBuffer);
             graphics_->SetRenderTarget(2, depthBuffer);
             graphics_->SetRenderTarget(2, depthBuffer);
-        graphics_->SetDepthStencil(depthStencil_);
-        graphics_->SetViewport(screenRect_);
-        graphics_->Clear(CLEAR_DEPTH | CLEAR_STENCIL);
-        #endif
+        }
         
         
         RenderBatchQueue(gBufferQueue_);
         RenderBatchQueue(gBufferQueue_);
         
         
         graphics_->SetAlphaTest(false);
         graphics_->SetAlphaTest(false);
         graphics_->SetBlendMode(BLEND_REPLACE);
         graphics_->SetBlendMode(BLEND_REPLACE);
         
         
-        #ifndef USE_OPENGL
-        // On Direct3D9, clear now the parts of G-Buffer that were not rendered into
-        graphics_->SetDepthTest(CMP_LESSEQUAL);
-        graphics_->SetDepthWrite(false);
-        if (graphics_->GetHardwareDepthSupport())
-            graphics_->ResetRenderTarget(1);
-        else
+        // If hardware depth is not available, perform a post-step to initialize the parts of the G-buffer that were not rendered into
+        // (it is less expensive than clearing all the buffers in the first place)
+        if (!graphics_->GetHardwareDepthSupport())
         {
         {
+            graphics_->SetDepthTest(CMP_LESSEQUAL);
+            graphics_->SetDepthWrite(false);
             graphics_->ResetRenderTarget(2);
             graphics_->ResetRenderTarget(2);
             graphics_->SetRenderTarget(1, depthBuffer);
             graphics_->SetRenderTarget(1, depthBuffer);
+            
+            DrawFullScreenQuad(*camera_, renderer_->GetVertexShader("GBufferFill"), renderer_->GetPixelShader("GBufferFill"),
+                false, shaderParameters_);
         }
         }
-        String pixelShaderName = "GBufferFill";
-        if (!graphics_->GetHardwareDepthSupport())
-            pixelShaderName += "_Depth";
-        DrawFullScreenQuad(*camera_, renderer_->GetVertexShader("GBufferFill"), renderer_->GetPixelShader(pixelShaderName),
-            false, shaderParameters_);
-        #endif
+        
+        graphics_->ResetRenderTarget(1);
     }
     }
     
     
     {
     {
@@ -845,13 +838,12 @@ void View::RenderBatchesDeferred()
         
         
         // Render ambient color & fog. On OpenGL the depth buffer will be copied now
         // Render ambient color & fog. On OpenGL the depth buffer will be copied now
         graphics_->SetDepthTest(CMP_ALWAYS);
         graphics_->SetDepthTest(CMP_ALWAYS);
-        graphics_->SetRenderTarget(0, renderBuffer);
-        graphics_->ResetRenderTarget(1);
         #ifdef USE_OPENGL
         #ifdef USE_OPENGL
         graphics_->SetDepthWrite(true);
         graphics_->SetDepthWrite(true);
         #else
         #else
-        graphics_->ResetRenderTarget(2);
+        graphics_->SetDepthWrite(false);
         #endif
         #endif
+        graphics_->SetRenderTarget(0, renderBuffer);
         graphics_->SetDepthStencil(depthStencil_);
         graphics_->SetDepthStencil(depthStencil_);
         graphics_->SetViewport(screenRect_);
         graphics_->SetViewport(screenRect_);
         graphics_->SetTexture(TU_DIFFBUFFER, diffBuffer);
         graphics_->SetTexture(TU_DIFFBUFFER, diffBuffer);

+ 3 - 6
SourceAssets/HLSLShaders/GBufferFill.hlsl

@@ -8,13 +8,10 @@ void VS(float4 iPos : POSITION,
 }
 }
 
 
 void PS(
 void PS(
-    #ifdef DEPTH
-        out float4 oDepth : COLOR1,
-    #endif
-    out float4 oDiff : COLOR0)
+    out float4 oDiff : COLOR0,
+    out float4 oDepth : COLOR1
+)
 {
 {
     oDiff = 0.0;
     oDiff = 0.0;
-    #ifdef DEPTH
     oDepth = 1.0;
     oDepth = 1.0;
-    #endif
 }
 }

+ 1 - 3
SourceAssets/HLSLShaders/GBufferFill.xml

@@ -1,6 +1,4 @@
 <shaders>
 <shaders>
     <shader name="GBufferFill" type="vs" />
     <shader name="GBufferFill" type="vs" />
-    <shader name="GBufferFill" type="ps">
-        <option name="Depth" define="DEPTH" />
-    </shader>
+    <shader name="GBufferFill" type="ps" />
 </shaders>
 </shaders>