Странные артефакты при луче объема
Итак, я пишу Volume Caster (впервые) на Java, изучая код отличного набора инструментов VTK, написанного на C.
Все работает почти так же, как VTK, за исключением того, что я получаю эти странные артефакты, похожие на линии высот на томе. Я заметил, что VTK также показывает их при манипулировании изображением, но они исчезают, когда изображение статично.
Я просматривал код несколько раз и не могу найти источник артефактов. Может быть, это нечто простое, что эксперт по компьютерной графике знает из головы?:)
Больше информации о моей реализации
- Я использую метод градиента для обычных расчетов (стандарт из того, что я нашел в интернете)
- Я использую трилинейную интерполяцию для значений точек луча
- Эти артефакты "линии высот" выглядят как ошибки округления значений, но я не могу найти ни одного в своем коде
- Увеличение разрешения рендера не решает проблему
- Похоже, что артефакты не "направлены" на какое-либо фиксированное направление, например положение камеры
- Я не прилагаю код, так как он огромен:)
EDIT (лучевая композитная петля)
while (Geometry.pointInsideCuboid(cuboid, position) && result.a > MINIMAL_OPACITY) {
if (currentVoxel.notEquals(previousVoxel)) {
final float value = VoxelUtils.interpolate(position, voxels, buffer);
color = colorLUT.getColor(value);
opacity = opacityLUT.getOpacityFromLut(value);
if (enableShading) {
final Vector3D normal = VoxelUtils.getNormal(position, voxels, buffer);
final float cos = normal.dot(light.fixedDirection);
final float gradientOpacity = cos < 0 ? 0 : cos;
opacity *= gradientOpacity;
if(cos > 0)
color = color.clone().shade(cos, colorLUT.diffuse, colorLUT.specular);
}
previousVoxel.setTo(currentVoxel);
}
if(opacity > 0)
result.accumulate(color, opacity);
position.add(rayStep);
currentVoxel.fromVector(position);
}