Ver código fonte

Updated shader compiler so it properly cross-compiles sample-compare intrinsics
Additional fixes to some of the shaders

BearishSun 8 anos atrás
pai
commit
0955ecf565

+ 8 - 5
Data/Raw/Engine/Includes/LightingCommon.bslinc

@@ -338,16 +338,19 @@ mixin LightingCommon
 			return lightData.color * illuminance * attenuation * surfaceShading;
 		}
 		
-		#if USE_COMPUTE_INDICES
+		#ifdef USE_COMPUTE_INDICES
 			groupshared uint gLightIndices[MAX_LIGHTS];
+			StructuredBuffer<LightData> gLights;
+			#define REQUIRES_LIGHT_ITERATION 1
 		#endif
-		#if USE_LIGHT_GRID_INDICES
+		
+		#ifdef USE_LIGHT_GRID_INDICES
 			Buffer<uint> gLightIndices;
+			StructuredBuffer<LightData> gLights;
+			#define REQUIRES_LIGHT_ITERATION 1
 		#endif
 		
-		#if USE_COMPUTE_INDICES || USE_LIGHT_GRID_INDICES
-		StructuredBuffer<LightData> gLights;
-		
+		#ifdef REQUIRES_LIGHT_ITERATION
 		float4 getDirectLighting(float3 worldPos, float3 V, float3 R, SurfaceData surfaceData, uint4 lightOffsets)
 		{
 			float3 N = surfaceData.worldNormal.xyz;

+ 4 - 5
Data/Raw/Engine/Includes/ShadowDepthBase.bslinc

@@ -28,16 +28,15 @@ mixin ShadowDepthBase
 		cbuffer ShadowParams
 		{
 			float4x4 gMatViewProj;
-			float2 gNDCZToViewZ;
 			float2 gNDCZToDeviceZ;
 			float gDepthBias;
-			float gDepthRange;
+			float gInvDepthRange;
 		};
 		
-		/** Converts Z value from view space to NDC space. */
-		float convertToNDCZ(float viewZ)
+		/** Converts Z value from device range ([0, 1]) to NDC space. */
+		float DeviceZToNDCZ(float deviceZ)
 		{
-			return -gNDCZToViewZ.y + (gNDCZToViewZ.x / viewZ);
+			return deviceZ / gNDCZToDeviceZ.x - gNDCZToDeviceZ.y;
 		}
 		
 		/** Converts Z value from NDC space to device Z value in range [0, 1]. */

+ 3 - 1
Data/Raw/Engine/Includes/SurfaceData.bslinc

@@ -11,6 +11,7 @@ mixin SurfaceData
 			float metalness;
 		};
 		
+#ifdef MSAA_COUNT
 #if MSAA_COUNT > 1
 		bool needsPerSampleShading(SurfaceData samples[MSAA_COUNT])
 		{
@@ -34,6 +35,7 @@ mixin SurfaceData
 			
 			return false;
 		}
-#endif			
+#endif
+#endif
 	};
 };

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

@@ -4,7 +4,7 @@ mixin ShadowDepth
 { 
 	code
 	{
-		float4 fsmain(ShadowVStoFS input, float outDepth : SV_Depth)
+		float4 fsmain(ShadowVStoFS input, out float outDepth : SV_Depth) : SV_Target0
 		{
 			outDepth = saturate(-input.shadowPos * gInvDepthRange + gDepthBias);
 			return 0;

+ 4 - 4
Data/Raw/Engine/Shaders/ShadowProjectOmni.bsl

@@ -155,13 +155,13 @@ technique ShadowProjectOmni
 			
 			float occlusion = 0.0f;
 			#if SHADOW_QUALITY <= 1
-				//occlusion = gShadowCubeTex.SampleCmpLevelZero(gShadowCubeSampler, lightDir, receiverDepth - shadowBias);
+				occlusion = gShadowCubeTex.SampleCmpLevelZero(gShadowCubeSampler, lightDir, receiverDepth - shadowBias);
 			#elif SHADOW_QUALITY == 2
 				[unroll]
 				for(int i = 0; i < 4; ++i)
 				{
 					float sampleDir = lightDir + side * discSamples4[i].x + up * discSamples4[i].y;
-					//occlusion += gShadowCubeTex.SampleCmpLevelZero(gShadowCubeSampler, sampleDir, receiverDepth - shadowBias);
+					occlusion += gShadowCubeTex.SampleCmpLevelZero(gShadowCubeSampler, sampleDir, receiverDepth - shadowBias);
 				}
 				
 				occlusion /= 4;
@@ -170,7 +170,7 @@ technique ShadowProjectOmni
 				for(int i = 0; i < 12; ++i)
 				{
 					float sampleDir = lightDir + side * discSamples12[i].x + up * discSamples12[i].y;
-					//occlusion += gShadowCubeTex.SampleCmpLevelZero(gShadowCubeSampler, sampleDir, receiverDepth - shadowBias);
+					occlusion += gShadowCubeTex.SampleCmpLevelZero(gShadowCubeSampler, sampleDir, receiverDepth - shadowBias);
 				}
 				
 				occlusion /= 12;
@@ -179,7 +179,7 @@ technique ShadowProjectOmni
 				for(int i = 0; i < 32; ++i)
 				{
 					float sampleDir = lightDir + side * discSamples32[i].x + up * discSamples32[i].y;
-					//occlusion += gShadowCubeTex.SampleCmpLevelZero(gShadowCubeSampler, sampleDir, receiverDepth - shadowBias);
+					occlusion += gShadowCubeTex.SampleCmpLevelZero(gShadowCubeSampler, sampleDir, receiverDepth - shadowBias);
 				}
 				
 				occlusion /= 32;

+ 13 - 2
Source/BansheeSL/Source/BsSLFXCompiler.cpp

@@ -74,7 +74,7 @@ namespace bs
 	class XscLog : public Xsc::Log
 	{
 	public:
-		void SumitReport(const Xsc::Report& report) override
+		void SubmitReport(const Xsc::Report& report) override
 		{
 			switch (report.Type())
 			{
@@ -586,7 +586,8 @@ namespace bs
 
 		XscLog log;
 		Xsc::Reflection::ReflectionData reflectionData;
-		if (!Xsc::CompileShader(inputDesc, outputDesc, &log, &reflectionData))
+		bool compileSuccess = Xsc::CompileShader(inputDesc, outputDesc, &log, &reflectionData);
+		if (!compileSuccess)
 		{
 			// If enabled, don't fail if entry point isn't found
 			bool done = true;
@@ -642,6 +643,16 @@ namespace bs
 				else if (entry.ident == "csmain")
 					detectedTypes->push_back(GPT_COMPUTE_PROGRAM);
 			}
+
+			// If no entry points found, and error occurred, report error
+			if(!compileSuccess && detectedTypes->size() == 0)
+			{
+				StringStream logOutput;
+				log.getMessages(logOutput);
+
+				LOGERR("Shader cross compilation failed. Log: \n\n" + logOutput.str());
+				return "";
+			}
 		}
 
 		if (shaderDesc != nullptr)

+ 1 - 1
Source/CMakeLists.txt

@@ -6,7 +6,7 @@ set (BS_VERSION_MAJOR 0)
 set (BS_VERSION_MINOR 4)
 
 set (BS_PREBUILT_DEPENDENCIES_VERSION 2)
-set (BS_SRC_DEPENDENCIES_VERSION 9)
+set (BS_SRC_DEPENDENCIES_VERSION 10)
 
 # Configuration types
 if(CMAKE_CONFIGURATION_TYPES) # Multiconfig generator?

+ 1 - 1
Source/External/XShaderCompiler

@@ -1 +1 @@
-Subproject commit bac6a329635ddc0e3f2b88d309c8f2fd7cffe315
+Subproject commit 2f2916eb35607d8063cfbe47922114c05476a7b0

+ 0 - 1
Source/RenderBeast/Include/BsShadowRendering.h

@@ -28,7 +28,6 @@ namespace bs { namespace ct
 
 	BS_PARAM_BLOCK_BEGIN(ShadowParamsDef)
 		BS_PARAM_BLOCK_ENTRY(Matrix4, gMatViewProj)
-		BS_PARAM_BLOCK_ENTRY(Vector2, gNDCZToViewZ)
 		BS_PARAM_BLOCK_ENTRY(Vector2, gNDCZToDeviceZ)
 		BS_PARAM_BLOCK_ENTRY(float, gDepthBias)
 		BS_PARAM_BLOCK_ENTRY(float, gInvDepthRange)

+ 0 - 3
Source/RenderBeast/Source/BsShadowRendering.cpp

@@ -989,7 +989,6 @@ namespace bs { namespace ct
 			gShadowParamsDef.gInvDepthRange.set(shadowParamsBuffer, 1.0f / shadowInfo.depthRange);
 			gShadowParamsDef.gMatViewProj.set(shadowParamsBuffer, shadowInfo.shadowVPTransform);
 			gShadowParamsDef.gNDCZToDeviceZ.set(shadowParamsBuffer, RendererView::getNDCZToDeviceZ());
-			gShadowParamsDef.gNDCZToViewZ.set(shadowParamsBuffer, RendererView::getNDCZToViewZ(proj));
 
 			rapi.setRenderTarget(shadowMap.getTarget(i));
 			rapi.clearRenderTarget(FBT_DEPTH);
@@ -1083,7 +1082,6 @@ namespace bs { namespace ct
 		gShadowParamsDef.gInvDepthRange.set(shadowParamsBuffer, 1.0f / mapInfo.depthRange);
 		gShadowParamsDef.gMatViewProj.set(shadowParamsBuffer, mapInfo.shadowVPTransform);
 		gShadowParamsDef.gNDCZToDeviceZ.set(shadowParamsBuffer, RendererView::getNDCZToDeviceZ());
-		gShadowParamsDef.gNDCZToViewZ.set(shadowParamsBuffer, RendererView::getNDCZToViewZ(proj));
 
 		mDepthNormalMat.bind(shadowParamsBuffer);
 
@@ -1186,7 +1184,6 @@ namespace bs { namespace ct
 		gShadowParamsDef.gInvDepthRange.set(shadowParamsBuffer, 1.0f / mapInfo.depthRange);
 		gShadowParamsDef.gMatViewProj.set(shadowParamsBuffer, Matrix4::IDENTITY);
 		gShadowParamsDef.gNDCZToDeviceZ.set(shadowParamsBuffer, RendererView::getNDCZToDeviceZ());
-		gShadowParamsDef.gNDCZToViewZ.set(shadowParamsBuffer, RendererView::getNDCZToViewZ(proj));
 
 		Matrix4 viewOffsetMat = Matrix4::translation(-light->getPosition());