2
0
Эх сурвалжийг харах

Tweaked the edge filter.
Fixed missing stencil buffer when using deferred antialiasing under OpenGL.

Lasse Öörni 14 жил өмнө
parent
commit
bea4f054c7

+ 8 - 14
Engine/Graphics/OpenGL/OGLGraphics.cpp

@@ -1275,22 +1275,16 @@ void Graphics::SetDepthStencil(RenderSurface* depthStencil)
         {
             int width = renderTargets_[0]->GetWidth();
             int height = renderTargets_[0]->GetHeight();
-            // Reuse the deferred depth buffer if possible
-            if ((depthBuffer_) && (width == width_) && (height == height_))
-                depthStencil = depthBuffer_->GetRenderSurface();
+            int searchKey = (width << 16) | height;
+            HashMap<int, SharedPtr<Texture2D> >::Iterator i = depthTextures_.Find(searchKey);
+            if (i != depthTextures_.End())
+                depthStencil = i->second_->GetRenderSurface();
             else
             {
-                int searchKey = (width << 16) | height;
-                Map<int, SharedPtr<Texture2D> >::Iterator i = depthTextures_.Find(searchKey);
-                if (i != depthTextures_.End())
-                    depthStencil = i->second_->GetRenderSurface();
-                else
-                {
-                    SharedPtr<Texture2D> newDepthTexture(new Texture2D(context_));
-                    newDepthTexture->SetSize(width, height, GetDepthStencilFormat(), TEXTURE_DEPTHSTENCIL);
-                    depthTextures_[searchKey] = newDepthTexture;
-                    depthStencil = newDepthTexture->GetRenderSurface();
-                }
+                SharedPtr<Texture2D> newDepthTexture(new Texture2D(context_));
+                newDepthTexture->SetSize(width, height, GetDepthStencilFormat(), TEXTURE_DEPTHSTENCIL);
+                depthTextures_[searchKey] = newDepthTexture;
+                depthStencil = newDepthTexture->GetRenderSurface();
             }
         }
         

+ 2 - 1
Engine/Graphics/OpenGL/OGLGraphics.h

@@ -24,6 +24,7 @@
 #pragma once
 
 #include "Color.h"
+#include "HashMap.h"
 #include "Matrix3x4.h"
 #include "Object.h"
 #include "Rect.h"
@@ -520,7 +521,7 @@ private:
     /// Default texture filtering mode
     TextureFilterMode defaultTextureFilterMode_;
     /// Map for additional depth textures, to emulate Direct3D9 ability to mix rendertarget and backbuffer rendering
-    Map<int, SharedPtr<Texture2D> > depthTextures_;
+    HashMap<int, SharedPtr<Texture2D> > depthTextures_;
 };
 
 /// Register Graphics library objects

+ 3 - 3
Engine/Graphics/Renderer.cpp

@@ -266,7 +266,7 @@ Renderer::Renderer(Context* context) :
     shadowMapHiresDepth_(false),
     reuseShadowMaps_(true),
     dynamicInstancing_(true),
-    edgeFilter_(EdgeFilterParameters(2.0f, 1.0f, 0.66f)),
+    edgeFilter_(EdgeFilterParameters(1.5f, 1.0f, 0.66f)),
     maxOccluderTriangles_(5000),
     occlusionBufferSize_(256),
     occluderSizeThreshold_(0.1f),
@@ -523,7 +523,7 @@ const OcclusionBuffer* Renderer::GetOcclusionBuffer(float aspectRatio, bool half
     }
     int searchKey = (width << 16) | height;
     
-    Map<int, SharedPtr<OcclusionBuffer> >::Iterator i = occlusionBuffers_.Find(searchKey);
+    HashMap<int, SharedPtr<OcclusionBuffer> >::Iterator i = occlusionBuffers_.Find(searchKey);
     if (i != occlusionBuffers_.End())
         return i->second_;
     else
@@ -776,7 +776,7 @@ OcclusionBuffer* Renderer::GetOrCreateOcclusionBuffer(Camera* camera, int maxOcc
     int searchKey = (width << 16) | height;
     
     SharedPtr<OcclusionBuffer> buffer;
-    Map<int, SharedPtr<OcclusionBuffer> >::Iterator i = occlusionBuffers_.Find(searchKey);
+    HashMap<int, SharedPtr<OcclusionBuffer> >::Iterator i = occlusionBuffers_.Find(searchKey);
     if (i != occlusionBuffers_.End())
         buffer = i->second_;
     else

+ 3 - 3
Engine/Graphics/Renderer.h

@@ -26,9 +26,9 @@
 #include "Batch.h"
 #include "Color.h"
 #include "Drawable.h"
+#include "HashMap.h"
 #include "HashSet.h"
 #include "RenderSurface.h"
-#include "Set.h"
 
 class DebugRenderer;
 class Geometry;
@@ -380,7 +380,7 @@ private:
     /// Reusable temporary scene nodes
     Vector<SharedPtr<Node> > tempNodeStore_;
     /// Occlusion buffers
-    Map<int, SharedPtr<OcclusionBuffer> > occlusionBuffers_;
+    HashMap<int, SharedPtr<OcclusionBuffer> > occlusionBuffers_;
     /// Viewports
     Vector<Viewport> viewports_;
     /// Views
@@ -388,7 +388,7 @@ private:
     /// Octrees that have been updated during the frame
     HashSet<Octree*> updateOctrees_;
     /// Techniques for which missing shader error has been displayed
-    Set<Technique*> shaderErrorDisplayed_;
+    HashSet<Technique*> shaderErrorDisplayed_;
     /// Vertex shader format
     String vsFormat_;
     /// Pixel shader format

+ 1 - 1
SourceAssets/GLSLShaders/EdgeFilter.frag

@@ -20,7 +20,7 @@ void main()
     float right = GetIntensity(texture2D(sDiffBuffer, vScreenPos + vec2(offsets.x, 0)).rgb);
     
     // Calculate normal, scale with base intensity
-    vec2 normal = vec2((up - base) + (base - down), (right - base) + (base - left)) / base;
+    vec2 normal = vec2(up - down, right - left) / base;
     float len = length(normal);
     
     // Clamp normal to maximum

+ 1 - 1
SourceAssets/HLSLShaders/EdgeFilter.hlsl

@@ -29,7 +29,7 @@ void PS(float2 iScreenPos : TEXCOORD0,
     float right = GetIntensity(tex2D(sDiffBuffer, iScreenPos + float2(offsets.x, 0)).rgb);
     
     // Calculate normal, scale with base intensity
-    float2 normal = float2((up - base) + (base - down), (right - base) + (base - left)) / base;
+    float2 normal = float2(up - down, right - left) / base;
     float len = length(normal);
     
     // Clamp normal to maximum