Improve SDF mip generation to use min-filter
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user