Răsfoiți Sursa

WIP: Getting OpenGL up to date
- Fixed MSAA coverage generation
- Fixed depth resolve shader when MSAA is enabled
- Fixed SSR when MSAA is enabled

BearishSun 8 ani în urmă
părinte
comite
1fe0027295

+ 7 - 2
Data/Raw/Engine/Includes/TemporalResolve.bslinc

@@ -267,7 +267,6 @@ mixin TemporalResolve
 			float exposureScale,
 			#endif // TEMPORAL_TONEMAP
 			float2 uv,
-			float2 uvColor, // Relevant for MSAA as uv is in screen space, but we might need the normalized one for color
 			float2 ndcPos, // Can be derived from UV, but we usually have it for free, so pass it directly
 			int sampleIdx)
 		{
@@ -308,13 +307,19 @@ mixin TemporalResolve
 				prevNdcPos = prevClip.xy / prevClip.w;
 			}
 			
-			#if MSAA
+			#if MSAA && MSAA_COLOR
 			float2 prevUV = NDCToScreen(prevNdcPos);
 			#else
 			float2 prevUV = NDCToUV(prevNdcPos);
 			#endif
 			
 			/////////////// GET FILTERED COLOR VALUE AND NEIGHBORHOOD MIN/MAX /////////////
+			#if MSAA && !MSAA_COLOR
+			float2 uvColor = uv * sceneColorTexelSize;
+			#else
+			float2 uvColor = uv;
+			#endif
+			
 			#if TEMPORAL_YCOCG
 			// YCOCG only requires a + pattern for good quality
 			float3 neighbor[5];

+ 5 - 3
Data/Raw/Engine/Shaders/Blit.bsl

@@ -1,11 +1,13 @@
 technique Blit
 {
 	depth
-	{
-		read = false;
-		
+	{	
 		#ifndef DEPTH
+		read = false;
 		write = false;
+		#else
+		// Cannot use read = false because that disables gl_FragDepth writes on OpenGL
+		compare = always;		
 		#endif
 	};
 

+ 1 - 1
Data/Raw/Engine/Shaders/MSAACoverage.bsl

@@ -16,7 +16,7 @@ technique MSAACoverage
 
 			[unroll]
 			for(uint i = 0; i < MSAA_COUNT; ++i)
-				surfaceData[i] = getGBufferData((int2)input.position.xy, i);
+				surfaceData[i] = getGBufferData((int2)input.uv0, i);
 
 			float3 albedo = surfaceData[0].albedo.xyz;
 			float3 normal = surfaceData[0].worldNormal.xyz;

+ 1 - 1
Data/Raw/Engine/Shaders/MSAACoverageStencil.bsl

@@ -18,7 +18,7 @@ technique MSAACoverageStencil
 	
 		float fsmain(VStoFS input) : SV_Target0
 		{
-			int2 pixelPos = (int2)input.position.xy;
+			int2 pixelPos = (int2)input.uv0.xy;
 			float coverage = gMSAACoverage.Load(int3(pixelPos, 0));
 			
 			// Note: Consider checking 2x2 pixel block and only discard if none require per-sample

+ 6 - 3
Data/Raw/Engine/Shaders/PPSSRResolve.bsl

@@ -46,16 +46,19 @@ technique PPSSRResolve
 					gSceneDepth, 
 					gSceneColor, gLinearSampler, gSceneColorTexelSize, 
 					gPrevColor, gLinearSampler, gSceneColorTexelSize,
-					gManualExposure, input.position.xy, input.uv0, input.screenPos, 0);
+					gManualExposure, input.uv0, input.screenPos, 0);
+					
+				col.a = gSceneColor.Sample(gLinearSampler, input.uv0 * gSceneColorTexelSize).a;
 			#else
 				col.rgb = temporalResolve(
 					gSceneDepth, gPointSampler, gSceneDepthTexelSize,
 					gSceneColor, gLinearSampler, gSceneColorTexelSize, 
 					gPrevColor, gLinearSampler, gSceneColorTexelSize,
-					gManualExposure, input.uv0, input.uv0, input.screenPos, 0);
+					gManualExposure, input.uv0, input.screenPos, 0);
+					
+				col.a = gSceneColor.Sample(gLinearSampler, input.uv0).a;
 			#endif
 			
-			col.a = gSceneColor.Sample(gLinearSampler, input.uv0).a;
 			return col;
 		}	
 	};

+ 2 - 2
Data/Raw/Engine/Shaders/PPSSRStencil.bsl

@@ -36,9 +36,9 @@ technique PPSSRStencil
 		{
 			#if MSAA_COUNT > 1 
 				#if MSAA_RESOLVE_0TH
-					SurfaceData surfData = getGBufferData(trunc(input.position.xy), 0);
+					SurfaceData surfData = getGBufferData(trunc(input.uv0.xy), 0);
 				#else
-					SurfaceData surfData = getGBufferData(trunc(input.position.xy), sampleIdx);
+					SurfaceData surfData = getGBufferData(trunc(input.uv0.xy), sampleIdx);
 				#endif
 			#else
 				SurfaceData surfData = getGBufferData(input.uv0);

+ 1 - 1
Data/Raw/Engine/Shaders/PPSSRTrace.bsl

@@ -84,7 +84,7 @@ technique PPSSRTrace
 			#endif
 		
 			#if MSAA_COUNT > 1
-			SurfaceData surfData = getGBufferData(trunc(pixelPos.xy), sampleIdx);
+			SurfaceData surfData = getGBufferData(trunc(input.uv0.xy), sampleIdx);
 			#else
 			SurfaceData surfData = getGBufferData(input.uv0);
 			#endif

+ 24 - 6
Source/RenderBeast/BsPostProcessing.cpp

@@ -1396,9 +1396,15 @@ namespace bs { namespace ct
 		SPtr<GpuParamBlockBuffer> perView = view.getPerViewBuffer();
 		mParamsSet->setParamBlockBuffer("PerCamera", perView);
 
+		const RendererViewProperties& viewProps = view.getProperties();
+		const Rect2I& viewRect = viewProps.viewRect;
 		gRendererUtility().setPass(mMaterial);
 		gRendererUtility().setPassParams(mParamsSet);
-		gRendererUtility().drawScreenQuad();
+
+		if(viewProps.numSamples > 1)
+			gRendererUtility().drawScreenQuad(Rect2(0.0f, 0.0f, (float)viewRect.width, (float)viewRect.height));
+		else
+			gRendererUtility().drawScreenQuad();
 	}
 
 	SSRStencilMat* SSRStencilMat::getVariation(bool msaa, bool singleSampleMSAA)
@@ -1541,7 +1547,11 @@ namespace bs { namespace ct
 
 		gRendererUtility().setPass(mMaterial);
 		gRendererUtility().setPassParams(mParamsSet);
-		gRendererUtility().drawScreenQuad();
+
+		if(viewProps.numSamples > 1)
+			gRendererUtility().drawScreenQuad(Rect2(0.0f, 0.0f, (float)viewRect.width, (float)viewRect.height));
+		else
+			gRendererUtility().drawScreenQuad();
 	}
 
 	Vector2 SSRTraceMat::calcRoughnessFadeScaleBias(float maxRoughness)
@@ -1743,9 +1753,15 @@ namespace bs { namespace ct
 		RenderAPI& rapi = RenderAPI::instance();
 		rapi.setRenderTarget(destination);
 
+		const RendererViewProperties& viewProps = view.getProperties();
+		const Rect2I& viewRect = viewProps.viewRect;
 		gRendererUtility().setPass(mMaterial);
 		gRendererUtility().setPassParams(mParamsSet);
-		gRendererUtility().drawScreenQuad();
+
+		if(viewProps.numSamples > 1)
+			gRendererUtility().drawScreenQuad(Rect2(0.0f, 0.0f, (float)viewRect.width, (float)viewRect.height));
+		else
+			gRendererUtility().drawScreenQuad();
 	}
 
 	SSRResolveMat* SSRResolveMat::getVariation(bool msaa)
@@ -1827,12 +1843,13 @@ namespace bs { namespace ct
 	{
 		mGBufferParams.bind(gbuffer);
 
+		const Rect2I& viewRect = view.getProperties().viewRect;
 		SPtr<GpuParamBlockBuffer> perView = view.getPerViewBuffer();
 		mParamsSet->setParamBlockBuffer("PerCamera", perView);
 
 		gRendererUtility().setPass(mMaterial);
 		gRendererUtility().setPassParams(mParamsSet);
-		gRendererUtility().drawScreenQuad();
+		gRendererUtility().drawScreenQuad(Rect2(0, 0, (float)viewRect.width, (float)viewRect.height));
 	}
 
 	MSAACoverageMat* MSAACoverageMat::getVariation(UINT32 msaaCount)
@@ -1860,12 +1877,13 @@ namespace bs { namespace ct
 		// Do nothing
 	}
 
-	void MSAACoverageStencilMat::execute(const SPtr<Texture>& coverage)
+	void MSAACoverageStencilMat::execute(const RendererView& view, const SPtr<Texture>& coverage)
 	{
+		const Rect2I& viewRect = view.getProperties().viewRect;
 		mCoverageTexParam.set(coverage);
 
 		gRendererUtility().setPass(mMaterial);
 		gRendererUtility().setPassParams(mParamsSet);
-		gRendererUtility().drawScreenQuad();
+		gRendererUtility().drawScreenQuad(Rect2(0, 0, (float)viewRect.width, (float)viewRect.height));
 	}
 }}

+ 2 - 1
Source/RenderBeast/BsPostProcessing.h

@@ -861,9 +861,10 @@ namespace bs { namespace ct
 		/** 
 		 * Renders the effect with the provided parameters, using the currently bound render target. 
 		 * 
+		 * @param[in]	view		Information about the view we're rendering from.
 		 * @param[in]	coverage	Coverage texture as output by MSAACoverageMat.
 		 */
-		void execute(const SPtr<Texture>& coverage);
+		void execute(const RendererView& view, const SPtr<Texture>& coverage);
 	private:
 		GpuParamTexture mCoverageTexParam;
 	};

+ 1 - 1
Source/RenderBeast/BsRenderCompositor.cpp

@@ -432,7 +432,7 @@ namespace bs { namespace ct
 
 		MSAACoverageStencilMat* stencilMat = MSAACoverageStencilMat::get();
 		rapi.setRenderTarget(sceneDepthNode->depthTex->renderTexture);
-		stencilMat->execute(output->texture);
+		stencilMat->execute(inputs.view, output->texture);
 	}
 
 	void RCNodeMSAACoverage::clear()