diff --git a/src/render/actors/VoxelActor.cpp b/src/render/actors/VoxelActor.cpp index aeb43d2..60842ff 100644 --- a/src/render/actors/VoxelActor.cpp +++ b/src/render/actors/VoxelActor.cpp @@ -77,6 +77,13 @@ vtkSmartPointer assembleVolume(vtkImageData* img, (bnd[3] - bnd[2]) * (bnd[3] - bnd[2]) + (bnd[5] - bnd[4]) * (bnd[5] - bnd[4])); // 包围盒对角(最长穿越路径) + // 大体(如雷达:24M 体素、深度采样距 mm 级 → 单条光线上千采样步)开启【交互期】采样距自适应: + // 旋转时 VTK 自动加大采样步(变粗)保流畅,停手即恢复设定的细采样距(0.3×minSp)出全质量帧。 + // 只是渲染期降采样、【绝不动数据】;切片/异常取自全分辨率体,保真不受影响。 + // 小体(反演,实测~7ms/帧)保持全程全质量,避免"停手补高清"的视觉突跳。 + constexpr vtkIdType kInteractiveLodVoxels = 4'000'000; + const int interactiveAdjust = (img->GetNumberOfPoints() > kInteractiveLodVoxels) ? 1 : 0; + vtkSmartPointer mapper; if (mask && g_gpuVolumeSupported) { // 真白化:mask=0 体素被光线投射完全跳过,杜绝空值格沿边界渗蓝。需 GPU 光线投射支持。 @@ -84,8 +91,8 @@ vtkSmartPointer assembleVolume(vtkImageData* img, gpu->SetInputData(img); gpu->SetMaskInput(mask); gpu->SetMaskTypeToBinary(); - gpu->SetAutoAdjustSampleDistances(0); // 全程全质量(GPU 直接 mapper 无交互降采样开关) - // 关了自适应必须显式给【细】采样距离,否则用粗默认值 → 看到一层层体素(分层伪影)。 + gpu->SetAutoAdjustSampleDistances(interactiveAdjust); // 大体:交互降采样保流畅,停手全质量;小体:全程全质量 + // 静止帧用【细】采样距离(0.3×minSp):否则用粗默认值 → 看到一层层体素(分层伪影)。 if (minSp > 0) gpu->SetSampleDistance(static_cast(0.3 * minSp)); // 抖动:用噪声纹理微扰每条光线的采样起点,消除规则采样面造成的「木纹/分层」伪影(VTK 官方此用途)。 gpu->SetUseJittering(1); @@ -94,9 +101,9 @@ vtkSmartPointer assembleVolume(vtkImageData* img, // SmartVolumeMapper:有 GPU 走 GPU ray cast,否则自动回退 CPU,避免无 GPU 时卡死/失败。 vtkNew sm; sm->SetInputData(img); - // 全程统一全质量(GPU 足够快, 实测 ~7ms/帧):关掉交互降采样, 避免"停手补高清"那一帧突跳停顿。 - sm->SetAutoAdjustSampleDistances(0); - sm->SetInteractiveAdjustSampleDistances(0); + // 大体交互降采样保流畅(停手恢复全质量);小体全程全质量(GPU 足够快, 实测 ~7ms/帧)避免突跳。 + sm->SetAutoAdjustSampleDistances(interactiveAdjust); + sm->SetInteractiveAdjustSampleDistances(interactiveAdjust); mapper = sm; }