ソースを参照

Fix an issue where OpenGL sampler states were wrong for the first rendered texture

BearishSun 9 年 前
コミット
bc1578be1a

+ 2 - 1
Source/BansheeCore/Include/BsRenderAPI.h

@@ -326,7 +326,8 @@ namespace BansheeEngine
 		virtual const String& getShadingLanguageName() const = 0;
 		virtual const String& getShadingLanguageName() const = 0;
 
 
 		/**
 		/**
-		 * Sets a sampler state for the specified texture unit.
+		 * Sets a sampler state for the specified texture unit. Make sure to assign the sampler state after the texture
+		 * has been assigned, as certain APIs will reset sampler state on texture bind.
 		 *
 		 *
 		 * @param[in]	gptype			Determines to which GPU program slot to bind the sampler state.
 		 * @param[in]	gptype			Determines to which GPU program slot to bind the sampler state.
 		 * @param[in]	texUnit			Texture unit index to bind the state to.
 		 * @param[in]	texUnit			Texture unit index to bind the state to.

+ 10 - 10
Source/BansheeEngine/Source/BsRendererUtility.cpp

@@ -206,16 +206,6 @@ namespace BansheeEngine
 		RenderAPICore& rapi = RenderAPICore::instance();
 		RenderAPICore& rapi = RenderAPICore::instance();
 		const GpuParamDesc& paramDesc = params->getParamDesc();
 		const GpuParamDesc& paramDesc = params->getParamDesc();
 
 
-		for (auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
-		{
-			SPtr<SamplerStateCore> samplerState = params->getSamplerState(iter->second.slot);
-
-			if (samplerState == nullptr)
-				rapi.setSamplerState(type, iter->second.slot, SamplerStateCore::getDefault());
-			else
-				rapi.setSamplerState(type, iter->second.slot, samplerState);
-		}
-
 		for (auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)
 		for (auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)
 		{
 		{
 			SPtr<TextureCore> texture = params->getTexture(iter->second.slot);
 			SPtr<TextureCore> texture = params->getTexture(iter->second.slot);
@@ -244,6 +234,16 @@ namespace BansheeEngine
 			rapi.setBuffer(type, iter->second.slot, buffer, isLoadStore);
 			rapi.setBuffer(type, iter->second.slot, buffer, isLoadStore);
 		}
 		}
 
 
+		for (auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
+		{
+			SPtr<SamplerStateCore> samplerState = params->getSamplerState(iter->second.slot);
+
+			if (samplerState == nullptr)
+				rapi.setSamplerState(type, iter->second.slot, SamplerStateCore::getDefault());
+			else
+				rapi.setSamplerState(type, iter->second.slot, samplerState);
+		}
+
 		for (auto iter = paramDesc.paramBlocks.begin(); iter != paramDesc.paramBlocks.end(); ++iter)
 		for (auto iter = paramDesc.paramBlocks.begin(); iter != paramDesc.paramBlocks.end(); ++iter)
 		{
 		{
 			SPtr<GpuParamBlockBufferCore> blockBuffer = params->getParamBlockBuffer(iter->second.slot);
 			SPtr<GpuParamBlockBufferCore> blockBuffer = params->getParamBlockBuffer(iter->second.slot);

+ 20 - 20
Source/RenderBeast/Source/BsRenderBeast.cpp

@@ -907,26 +907,6 @@ namespace BansheeEngine
 
 
 			const GpuParamDesc& paramDesc = params->getParamDesc();
 			const GpuParamDesc& paramDesc = params->getParamDesc();
 
 
-			for (auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
-			{
-				SPtr<SamplerStateCore> samplerState;
-
-				if (samplerOverrides != nullptr)
-				{
-					UINT32 overrideIndex = samplerOverrides->passes[passIdx].stages[i].stateOverrides[iter->second.slot];
-					if(overrideIndex != (UINT32)-1)
-						samplerState = samplerOverrides->overrides[overrideIndex].state;
-				}
-				
-				if(samplerState == nullptr)
-					samplerState = params->getSamplerState(iter->second.slot);
-
-				if (samplerState == nullptr)
-					rapi.setSamplerState(stages[i], iter->second.slot, SamplerStateCore::getDefault());
-				else
-					rapi.setSamplerState(stages[i], iter->second.slot, samplerState);
-			}
-
 			for (auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)
 			for (auto iter = paramDesc.textures.begin(); iter != paramDesc.textures.end(); ++iter)
 			{
 			{
 				SPtr<TextureCore> texture = params->getTexture(iter->second.slot);
 				SPtr<TextureCore> texture = params->getTexture(iter->second.slot);
@@ -961,6 +941,26 @@ namespace BansheeEngine
 
 
 				rapi.setParamBuffer(stages[i], iter->second.slot, blockBuffer, paramDesc);
 				rapi.setParamBuffer(stages[i], iter->second.slot, blockBuffer, paramDesc);
 			}
 			}
+
+			for (auto iter = paramDesc.samplers.begin(); iter != paramDesc.samplers.end(); ++iter)
+			{
+				SPtr<SamplerStateCore> samplerState;
+
+				if (samplerOverrides != nullptr)
+				{
+					UINT32 overrideIndex = samplerOverrides->passes[passIdx].stages[i].stateOverrides[iter->second.slot];
+					if (overrideIndex != (UINT32)-1)
+						samplerState = samplerOverrides->overrides[overrideIndex].state;
+				}
+
+				if (samplerState == nullptr)
+					samplerState = params->getSamplerState(iter->second.slot);
+
+				if (samplerState == nullptr)
+					rapi.setSamplerState(stages[i], iter->second.slot, SamplerStateCore::getDefault());
+				else
+					rapi.setSamplerState(stages[i], iter->second.slot, samplerState);
+			}
 		}
 		}
 	}
 	}
 }
 }