Improve SDF mip generation to use min-filter

This commit is contained in:
Wojtek Figat
2024-05-29 15:00:03 +02:00
parent 80fbe048bf
commit a8220147ce
2 changed files with 3 additions and 31 deletions

View File

@@ -572,9 +572,8 @@ bool ModelTool::GenerateModelSDF(Model* inputModel, ModelData* modelData, float
const int32 yAddress = resolutionMip.X * y + zAddress;
for (int32 x = 0; x < resolutionMip.X; x++)
{
// Linear box filter around the voxel
// TODO: use min distance for nearby texels (texel distance + distance to texel)
float distance = 0;
// Min-filter around the voxel
float distance = MAX_float;
for (int32 dz = 0; dz < 2; dz++)
{
const int32 dzAddress = (z * 2 + dz) * (resolution.Y * resolution.X);
@@ -585,11 +584,10 @@ bool ModelTool::GenerateModelSDF(Model* inputModel, ModelData* modelData, float
{
const int32 dxAddress = (x * 2 + dx) + dyAddress;
const float d = formatRead((byte*)voxelsMipSrc + dxAddress * formatStride) * decodeMAD.X + decodeMAD.Y;
distance += d;
distance = Math::Min(distance, d);
}
}
}
distance *= 1.0f / 8.0f;
const int32 xAddress = x + yAddress;
formatWrite((byte*)voxelsMip + xAddress * formatStride, distance * encodeMAD.X + encodeMAD.Y);

View File

@@ -218,32 +218,6 @@ void CS_FloodFill(uint3 GroupId : SV_GroupID, uint GroupIndex : SV_GroupIndex)
sdf = CombineSDF(sdf, voxelCoord + offset.xyy, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.yxy, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.yyx, nearbyDistance);
#if 0
nearbyDistance = WorldUnitsPerVoxel * 1.41421f;
sdf = CombineSDF(sdf, voxelCoord + offset.xxy, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.xzy, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.zzy, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.zxy, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.xyx, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.xyz, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.zyz, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.zyx, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.yxx, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.yxz, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.yzz, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.yzx, nearbyDistance);
#endif
#if 0
nearbyDistance = WorldUnitsPerVoxel * 1.73205f;
sdf = CombineSDF(sdf, voxelCoord + offset.xxx, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.xxz, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.xzx, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.xzz, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.zxx, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.zxz, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.zzx, nearbyDistance);
sdf = CombineSDF(sdf, voxelCoord + offset.zzz, nearbyDistance);
#endif
}
SDF[voxelIndex] = asuint(sdf);