Skip to content

Commit 3831af9

Browse files
authored
Merge pull request #807 from twpol/bugfix/64bit-z-fighting
fix: Stop z-fighting by pushing world/view/projection multiplications onto the GPU
2 parents a8a8910 + 791c0a3 commit 3831af9

File tree

8 files changed

+20
-25
lines changed

8 files changed

+20
-25
lines changed

Source/RunActivity/Content/SceneryShader.fx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
//////////////////// G L O B A L V A L U E S ///////////////////////////
2525

2626
float4x4 World; // model -> world
27-
float4x4 WorldViewProjection; // model -> world -> view -> projection
27+
float4x4 View; // world -> view
28+
float4x4 Projection; // view -> projection
2829
float4x4 LightViewProjectionShadowProjection0; // world -> light view -> light projection -> shadow map projection
2930
float4x4 LightViewProjectionShadowProjection1;
3031
float4x4 LightViewProjectionShadowProjection2;
@@ -156,7 +157,7 @@ struct VERTEX_OUTPUT
156157
void _VSNormalProjection(in VERTEX_INPUT In, inout VERTEX_OUTPUT Out)
157158
{
158159
// Project position, normal and copy texture coords
159-
Out.Position = mul(In.Position, WorldViewProjection);
160+
Out.Position = mul(mul(mul(In.Position, World), View), Projection);
160161
Out.RelPosition.xyz = mul(In.Position, World).xyz - ViewerPos;
161162
Out.RelPosition.w = Out.Position.z;
162163
Out.TexCoords.xy = In.TexCoords;
@@ -184,7 +185,7 @@ void _VSSignalProjection(uniform bool Glow, in VERTEX_INPUT_SIGNAL In, inout VER
184185
const float GlowScalingFactor = 40;
185186
In.Position.xyz *= log(1 + max(0, length(relPos) - GlowCutOffM) / GlowScalingFactor) * ZBias_Lighting.x;
186187
}
187-
Out.Position = mul(In.Position, WorldViewProjection);
188+
Out.Position = mul(mul(mul(In.Position, World), View), Projection);
188189
Out.RelPosition.xyz = relPos;
189190
Out.RelPosition.w = Out.Position.z;
190191
Out.TexCoords.xy = In.TexCoords;
@@ -194,7 +195,7 @@ void _VSSignalProjection(uniform bool Glow, in VERTEX_INPUT_SIGNAL In, inout VER
194195
void _VSTransferProjection(in VERTEX_INPUT_TRANSFER In, inout VERTEX_OUTPUT Out)
195196
{
196197
// Project position, normal and copy texture coords
197-
Out.Position = mul(In.Position, WorldViewProjection);
198+
Out.Position = mul(mul(mul(In.Position, World), View), Projection);
198199
Out.RelPosition.xyz = mul(In.Position, World).xyz - ViewerPos;
199200
Out.RelPosition.w = Out.Position.z;
200201
Out.TexCoords.xy = In.TexCoords;
@@ -301,7 +302,7 @@ VERTEX_OUTPUT VSForest(in VERTEX_INPUT_FOREST In)
301302
In.Position = float4(newPosition, 1);
302303

303304
// Project vertex with fixed w=1 and normal=eye.
304-
Out.Position = mul(In.Position, WorldViewProjection);
305+
Out.Position = mul(mul(mul(In.Position, World), View), Projection);
305306
Out.RelPosition.xyz = mul(In.Position, World).xyz - ViewerPos;
306307
Out.RelPosition.w = Out.Position.z;
307308
Out.TexCoords.xy = In.TexCoords;

Source/RunActivity/Viewer3D/Forest.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -431,15 +431,14 @@ public override void SetState(GraphicsDevice graphicsDevice, Material previousMa
431431
public override void Render(GraphicsDevice graphicsDevice, IEnumerable<RenderItem> renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix)
432432
{
433433
var shader = Viewer.MaterialManager.SceneryShader;
434-
var viewproj = XNAViewMatrix * XNAProjectionMatrix;
435434

436435
shader.SetViewMatrix(ref XNAViewMatrix);
437436
ShaderPasses.Reset();
438437
while (ShaderPasses.MoveNext())
439438
{
440439
foreach (var item in renderItems)
441440
{
442-
shader.SetMatrix(item.XNAMatrix, ref viewproj);
441+
shader.SetMatrix(item.XNAMatrix, ref XNAViewMatrix, ref XNAProjectionMatrix);
443442
shader.ZBias = item.RenderPrimitive.ZBias;
444443
ShaderPasses.Current.Apply();
445444

Source/RunActivity/Viewer3D/Materials.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -904,14 +904,13 @@ public override void SetState(GraphicsDevice graphicsDevice, Material previousMa
904904
public override void Render(GraphicsDevice graphicsDevice, IEnumerable<RenderItem> renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix)
905905
{
906906
var shader = Viewer.MaterialManager.SceneryShader;
907-
var viewProj = XNAViewMatrix * XNAProjectionMatrix;
908907

909908
ShaderPasses.Reset();
910909
while (ShaderPasses.MoveNext())
911910
{
912911
foreach (var item in renderItems)
913912
{
914-
shader.SetMatrix(item.XNAMatrix, ref viewProj);
913+
shader.SetMatrix(item.XNAMatrix, ref XNAViewMatrix, ref XNAProjectionMatrix);
915914
shader.ZBias = item.RenderPrimitive.ZBias;
916915
ShaderPasses.Current.Apply();
917916

Source/RunActivity/Viewer3D/Shaders.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ class Logger : ContentBuildLogger
7878
public class SceneryShader : Shader
7979
{
8080
readonly EffectParameter world;
81-
readonly EffectParameter worldViewProjection;
81+
readonly EffectParameter view;
82+
readonly EffectParameter projection;
8283
readonly EffectParameter[] lightViewProjectionShadowProjection;
8384
readonly EffectParameter[] shadowMapTextures;
8485
readonly EffectParameter shadowMapLimit;
@@ -116,10 +117,11 @@ public void SetViewMatrix(ref Matrix v)
116117
sideVector.SetValue(Vector3.Normalize(Vector3.Cross(_eyeVector, Vector3.Down)));
117118
}
118119

119-
public void SetMatrix(Matrix w, ref Matrix vp)
120+
public void SetMatrix(Matrix w, ref Matrix v, ref Matrix p)
120121
{
121122
world.SetValue(w);
122-
worldViewProjection.SetValue(w * vp);
123+
view.SetValue(v);
124+
projection.SetValue(p);
123125

124126
int vIn = Program.Simulator.Settings.DayAmbientLight;
125127

@@ -225,7 +227,8 @@ public SceneryShader(GraphicsDevice graphicsDevice)
225227
: base(graphicsDevice, "SceneryShader")
226228
{
227229
world = Parameters["World"];
228-
worldViewProjection = Parameters["WorldViewProjection"];
230+
view = Parameters["View"];
231+
projection = Parameters["Projection"];
229232
lightViewProjectionShadowProjection = new EffectParameter[RenderProcess.ShadowMapCountMaximum];
230233
shadowMapTextures = new EffectParameter[RenderProcess.ShadowMapCountMaximum];
231234
for (var i = 0; i < RenderProcess.ShadowMapCountMaximum; i++)

Source/RunActivity/Viewer3D/Signals.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -694,14 +694,12 @@ public override void SetState(GraphicsDevice graphicsDevice, Material previousMa
694694

695695
public override void Render(GraphicsDevice graphicsDevice, IEnumerable<RenderItem> renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix)
696696
{
697-
var viewProj = XNAViewMatrix * XNAProjectionMatrix;
698-
699697
foreach (var pass in SceneryShader.CurrentTechnique.Passes)
700698
{
701699
foreach (var item in renderItems)
702700
{
703701
SceneryShader.SignalLightIntensity = (item.ItemData as SignalLightState).GetIntensity();
704-
SceneryShader.SetMatrix(item.XNAMatrix, ref viewProj);
702+
SceneryShader.SetMatrix(item.XNAMatrix, ref XNAViewMatrix, ref XNAProjectionMatrix);
705703
pass.Apply();
706704
item.RenderPrimitive.Draw(graphicsDevice);
707705
}
@@ -752,16 +750,14 @@ public override void SetState(GraphicsDevice graphicsDevice, Material previousMa
752750

753751
public override void Render(GraphicsDevice graphicsDevice, IEnumerable<RenderItem> renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix)
754752
{
755-
var viewProj = XNAViewMatrix * XNAProjectionMatrix;
756-
757753
foreach (var pass in SceneryShader.CurrentTechnique.Passes)
758754
{
759755
foreach (var item in renderItems)
760756
{
761757
var slp = item.RenderPrimitive as SignalLightPrimitive;
762758
SceneryShader.ZBias = MathHelper.Lerp(slp.GlowIntensityDay, slp.GlowIntensityNight, NightEffect);
763759
SceneryShader.SignalLightIntensity = (item.ItemData as SignalLightState).GetIntensity();
764-
SceneryShader.SetMatrix(item.XNAMatrix, ref viewProj);
760+
SceneryShader.SetMatrix(item.XNAMatrix, ref XNAViewMatrix, ref XNAProjectionMatrix);
765761
pass.Apply();
766762
item.RenderPrimitive.Draw(graphicsDevice);
767763
}

Source/RunActivity/Viewer3D/Terrain.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -530,14 +530,13 @@ public override void SetState(GraphicsDevice graphicsDevice, Material previousMa
530530
public override void Render(GraphicsDevice graphicsDevice, IEnumerable<RenderItem> renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix)
531531
{
532532
var shader = Viewer.MaterialManager.SceneryShader;
533-
var viewproj = XNAViewMatrix * XNAProjectionMatrix;
534533

535534
ShaderPasses.Reset();
536535
while (ShaderPasses.MoveNext())
537536
{
538537
foreach (var item in renderItems)
539538
{
540-
shader.SetMatrix(item.XNAMatrix, ref viewproj);
539+
shader.SetMatrix(item.XNAMatrix, ref XNAViewMatrix, ref XNAProjectionMatrix);
541540
shader.ZBias = item.RenderPrimitive.ZBias;
542541
ShaderPasses.Current.Apply();
543542
// SamplerStates can only be set after the ShaderPasses.Current.Apply().

Source/RunActivity/Viewer3D/Transfers.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,15 +178,14 @@ public override void SetState(GraphicsDevice graphicsDevice, Material previousMa
178178
public override void Render(GraphicsDevice graphicsDevice, IEnumerable<RenderItem> renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix)
179179
{
180180
var shader = Viewer.MaterialManager.SceneryShader;
181-
var viewproj = XNAViewMatrix * XNAProjectionMatrix;
182181

183182
shader.SetViewMatrix(ref XNAViewMatrix);
184183
ShaderPasses.Reset();
185184
while (ShaderPasses.MoveNext())
186185
{
187186
foreach (var item in renderItems)
188187
{
189-
shader.SetMatrix(item.XNAMatrix, ref viewproj);
188+
shader.SetMatrix(item.XNAMatrix, ref XNAViewMatrix, ref XNAProjectionMatrix);
190189
shader.ZBias = item.RenderPrimitive.ZBias;
191190
ShaderPasses.Current.Apply();
192191
// SamplerStates can only be set after the ShaderPasses.Current.Apply().

Source/RunActivity/Viewer3D/Water.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,14 +185,13 @@ public override void SetState(GraphicsDevice graphicsDevice, Material previousMa
185185
public override void Render(GraphicsDevice graphicsDevice, IEnumerable<RenderItem> renderItems, ref Matrix XNAViewMatrix, ref Matrix XNAProjectionMatrix)
186186
{
187187
var shader = Viewer.MaterialManager.SceneryShader;
188-
var viewproj = XNAViewMatrix * XNAProjectionMatrix;
189188

190189
ShaderPasses.Reset();
191190
while (ShaderPasses.MoveNext())
192191
{
193192
foreach (var item in renderItems)
194193
{
195-
shader.SetMatrix(item.XNAMatrix, ref viewproj);
194+
shader.SetMatrix(item.XNAMatrix, ref XNAViewMatrix, ref XNAProjectionMatrix);
196195
shader.ZBias = item.RenderPrimitive.ZBias;
197196
ShaderPasses.Current.Apply();
198197
// SamplerStates can only be set after the ShaderPasses.Current.Apply().

0 commit comments

Comments
 (0)