From 8c5dabaaf18446040b5238e83cca4c15113fe47f Mon Sep 17 00:00:00 2001 From: PodeCaradox Date: Fri, 3 Jun 2022 19:06:13 +0200 Subject: [PATCH] Culling with compute Version 3 --- VFRZInstancing/Content/instance_effect.fx | 11 +++++++---- VFRZInstancing/TileMap.cs | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/VFRZInstancing/Content/instance_effect.fx b/VFRZInstancing/Content/instance_effect.fx index b4a418d..4cecc8f 100644 --- a/VFRZInstancing/Content/instance_effect.fx +++ b/VFRZInstancing/Content/instance_effect.fx @@ -40,9 +40,12 @@ void InstancingCS(uint3 localID : SV_GroupThreadID, uint3 groupID : SV_GroupID, index.y += column; index.x += column; - - if(index.x < 0 || index.y < 0 || index.y >= MapSizeY || index.x >= MapSizeX) return; - VisibleTiles[globalID.x + globalID.y * Columns] = AllTiles[index.y * MapSizeX + index.x]; + uint visibleIndex = globalID.x + globalID.y * Columns; + if(index.x < 0 || index.y < 0 || index.y >= MapSizeY || index.x >= MapSizeX){ + VisibleTiles[visibleIndex].InstanceTransform.z = -1; + return; + } + VisibleTiles[visibleIndex] = AllTiles[index.y * MapSizeX + index.x]; } @@ -101,7 +104,7 @@ InstancingVSoutput InstancingVS(in StaticVSinput input) float2 position = input.Position.xy * imageSize - float2(imageSize.x / 2, imageSize.y);; //calculate position with camera - float4 pos = float4(position.xy + tile.InstanceTransform .xy,tile.InstanceTransform.z,1); + float4 pos = float4(position.xy + tile.InstanceTransform.xy, tile.InstanceTransform.z, 1); pos = mul(pos, WorldViewProjection); diff --git a/VFRZInstancing/TileMap.cs b/VFRZInstancing/TileMap.cs index f174c0c..005298a 100644 --- a/VFRZInstancing/TileMap.cs +++ b/VFRZInstancing/TileMap.cs @@ -90,7 +90,7 @@ public TileMap(Game game, int sizeX, int sizeZ) : base(game) { _size = new Point(sizeX, sizeZ); _raster.MultiSampleAntiAlias = false; - _raster.ScissorTestEnable = false; + _raster.ScissorTestEnable = true; _raster.FillMode = FillMode.Solid; _raster.CullMode = CullMode.CullCounterClockwiseFace; _raster.DepthClipEnable = true; @@ -327,7 +327,7 @@ private void ComputeCulling() _effect.CurrentTechnique.Passes[0].ApplyCompute(); GraphicsDevice.DispatchCompute(tileCountX / _computeGroupSize, tileCountY / _computeGroupSize, 1); - _instancesVertexBuffer = (uint)(tileCountX + tileCountY * tileCountX); + _instancesVertexBuffer = (uint)(tileCountY * tileCountX); } #endregion }