diff --git a/Source/RunActivity/Content/SceneryShader.fx b/Source/RunActivity/Content/SceneryShader.fx index 54b68eaee6..56df9b679b 100644 --- a/Source/RunActivity/Content/SceneryShader.fx +++ b/Source/RunActivity/Content/SceneryShader.fx @@ -24,7 +24,8 @@ //////////////////// G L O B A L V A L U E S /////////////////////////// float4x4 World; // model -> world -float4x4 WorldViewProjection; // model -> world -> view -> projection +float4x4 View; // world -> view +float4x4 Projection; // view -> projection float4x4 LightViewProjectionShadowProjection0; // world -> light view -> light projection -> shadow map projection float4x4 LightViewProjectionShadowProjection1; float4x4 LightViewProjectionShadowProjection2; @@ -156,7 +157,7 @@ struct VERTEX_OUTPUT void _VSNormalProjection(in VERTEX_INPUT In, inout VERTEX_OUTPUT Out) { // Project position, normal and copy texture coords - Out.Position = mul(In.Position, WorldViewProjection); + Out.Position = mul(mul(mul(In.Position, World), View), Projection); Out.RelPosition.xyz = mul(In.Position, World).xyz - ViewerPos; Out.RelPosition.w = Out.Position.z; Out.TexCoords.xy = In.TexCoords; @@ -184,7 +185,7 @@ void _VSSignalProjection(uniform bool Glow, in VERTEX_INPUT_SIGNAL In, inout VER const float GlowScalingFactor = 40; In.Position.xyz *= log(1 + max(0, length(relPos) - GlowCutOffM) / GlowScalingFactor) * ZBias_Lighting.x; } - Out.Position = mul(In.Position, WorldViewProjection); + Out.Position = mul(mul(mul(In.Position, World), View), Projection); Out.RelPosition.xyz = relPos; Out.RelPosition.w = Out.Position.z; Out.TexCoords.xy = In.TexCoords; @@ -194,7 +195,7 @@ void _VSSignalProjection(uniform bool Glow, in VERTEX_INPUT_SIGNAL In, inout VER void _VSTransferProjection(in VERTEX_INPUT_TRANSFER In, inout VERTEX_OUTPUT Out) { // Project position, normal and copy texture coords - Out.Position = mul(In.Position, WorldViewProjection); + Out.Position = mul(mul(mul(In.Position, World), View), Projection); Out.RelPosition.xyz = mul(In.Position, World).xyz - ViewerPos; Out.RelPosition.w = Out.Position.z; Out.TexCoords.xy = In.TexCoords; @@ -301,7 +302,7 @@ VERTEX_OUTPUT VSForest(in VERTEX_INPUT_FOREST In) In.Position = float4(newPosition, 1); // Project vertex with fixed w=1 and normal=eye. - Out.Position = mul(In.Position, WorldViewProjection); + Out.Position = mul(mul(mul(In.Position, World), View), Projection); Out.RelPosition.xyz = mul(In.Position, World).xyz - ViewerPos; Out.RelPosition.w = Out.Position.z; Out.TexCoords.xy = In.TexCoords; diff --git a/Source/RunActivity/Viewer3D/Forest.cs b/Source/RunActivity/Viewer3D/Forest.cs index 67539bbf58..d2edd02d7b 100644 --- a/Source/RunActivity/Viewer3D/Forest.cs +++ b/Source/RunActivity/Viewer3D/Forest.cs @@ -431,7 +431,6 @@ public override void SetState(GraphicsDevice graphicsDevice, Material previousMa public override void Render(GraphicsDevice graphicsDevice, IEnumerable renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix) { var shader = Viewer.MaterialManager.SceneryShader; - var viewproj = XNAViewMatrix * XNAProjectionMatrix; shader.SetViewMatrix(ref XNAViewMatrix); ShaderPasses.Reset(); @@ -439,7 +438,7 @@ public override void Render(GraphicsDevice graphicsDevice, IEnumerable renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix) { var shader = Viewer.MaterialManager.SceneryShader; - var viewProj = XNAViewMatrix * XNAProjectionMatrix; ShaderPasses.Reset(); while (ShaderPasses.MoveNext()) { foreach (var item in renderItems) { - shader.SetMatrix(item.XNAMatrix, ref viewProj); + shader.SetMatrix(item.XNAMatrix, ref XNAViewMatrix, ref XNAProjectionMatrix); shader.ZBias = item.RenderPrimitive.ZBias; ShaderPasses.Current.Apply(); diff --git a/Source/RunActivity/Viewer3D/Shaders.cs b/Source/RunActivity/Viewer3D/Shaders.cs index 58047d7653..0fcced2911 100644 --- a/Source/RunActivity/Viewer3D/Shaders.cs +++ b/Source/RunActivity/Viewer3D/Shaders.cs @@ -78,7 +78,8 @@ class Logger : ContentBuildLogger public class SceneryShader : Shader { readonly EffectParameter world; - readonly EffectParameter worldViewProjection; + readonly EffectParameter view; + readonly EffectParameter projection; readonly EffectParameter[] lightViewProjectionShadowProjection; readonly EffectParameter[] shadowMapTextures; readonly EffectParameter shadowMapLimit; @@ -116,10 +117,11 @@ public void SetViewMatrix(ref Matrix v) sideVector.SetValue(Vector3.Normalize(Vector3.Cross(_eyeVector, Vector3.Down))); } - public void SetMatrix(Matrix w, ref Matrix vp) + public void SetMatrix(Matrix w, ref Matrix v, ref Matrix p) { world.SetValue(w); - worldViewProjection.SetValue(w * vp); + view.SetValue(v); + projection.SetValue(p); int vIn = Program.Simulator.Settings.DayAmbientLight; @@ -225,7 +227,8 @@ public SceneryShader(GraphicsDevice graphicsDevice) : base(graphicsDevice, "SceneryShader") { world = Parameters["World"]; - worldViewProjection = Parameters["WorldViewProjection"]; + view = Parameters["View"]; + projection = Parameters["Projection"]; lightViewProjectionShadowProjection = new EffectParameter[RenderProcess.ShadowMapCountMaximum]; shadowMapTextures = new EffectParameter[RenderProcess.ShadowMapCountMaximum]; for (var i = 0; i < RenderProcess.ShadowMapCountMaximum; i++) diff --git a/Source/RunActivity/Viewer3D/Signals.cs b/Source/RunActivity/Viewer3D/Signals.cs index 5465562dc1..6638534265 100644 --- a/Source/RunActivity/Viewer3D/Signals.cs +++ b/Source/RunActivity/Viewer3D/Signals.cs @@ -694,14 +694,12 @@ public override void SetState(GraphicsDevice graphicsDevice, Material previousMa public override void Render(GraphicsDevice graphicsDevice, IEnumerable renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix) { - var viewProj = XNAViewMatrix * XNAProjectionMatrix; - foreach (var pass in SceneryShader.CurrentTechnique.Passes) { foreach (var item in renderItems) { SceneryShader.SignalLightIntensity = (item.ItemData as SignalLightState).GetIntensity(); - SceneryShader.SetMatrix(item.XNAMatrix, ref viewProj); + SceneryShader.SetMatrix(item.XNAMatrix, ref XNAViewMatrix, ref XNAProjectionMatrix); pass.Apply(); item.RenderPrimitive.Draw(graphicsDevice); } @@ -752,8 +750,6 @@ public override void SetState(GraphicsDevice graphicsDevice, Material previousMa public override void Render(GraphicsDevice graphicsDevice, IEnumerable renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix) { - var viewProj = XNAViewMatrix * XNAProjectionMatrix; - foreach (var pass in SceneryShader.CurrentTechnique.Passes) { foreach (var item in renderItems) @@ -761,7 +757,7 @@ public override void Render(GraphicsDevice graphicsDevice, IEnumerable renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix) { var shader = Viewer.MaterialManager.SceneryShader; - var viewproj = XNAViewMatrix * XNAProjectionMatrix; ShaderPasses.Reset(); while (ShaderPasses.MoveNext()) { foreach (var item in renderItems) { - shader.SetMatrix(item.XNAMatrix, ref viewproj); + shader.SetMatrix(item.XNAMatrix, ref XNAViewMatrix, ref XNAProjectionMatrix); shader.ZBias = item.RenderPrimitive.ZBias; ShaderPasses.Current.Apply(); // SamplerStates can only be set after the ShaderPasses.Current.Apply(). diff --git a/Source/RunActivity/Viewer3D/Transfers.cs b/Source/RunActivity/Viewer3D/Transfers.cs index 4243eb4d29..f0a8e330ab 100644 --- a/Source/RunActivity/Viewer3D/Transfers.cs +++ b/Source/RunActivity/Viewer3D/Transfers.cs @@ -178,7 +178,6 @@ public override void SetState(GraphicsDevice graphicsDevice, Material previousMa public override void Render(GraphicsDevice graphicsDevice, IEnumerable renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix) { var shader = Viewer.MaterialManager.SceneryShader; - var viewproj = XNAViewMatrix * XNAProjectionMatrix; shader.SetViewMatrix(ref XNAViewMatrix); ShaderPasses.Reset(); @@ -186,7 +185,7 @@ public override void Render(GraphicsDevice graphicsDevice, IEnumerable renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix) { var shader = Viewer.MaterialManager.SceneryShader; - var viewproj = XNAViewMatrix * XNAProjectionMatrix; ShaderPasses.Reset(); while (ShaderPasses.MoveNext()) { foreach (var item in renderItems) { - shader.SetMatrix(item.XNAMatrix, ref viewproj); + shader.SetMatrix(item.XNAMatrix, ref XNAViewMatrix, ref XNAProjectionMatrix); shader.ZBias = item.RenderPrimitive.ZBias; ShaderPasses.Current.Apply(); // SamplerStates can only be set after the ShaderPasses.Current.Apply().