Странные артефакты при луче объема

Итак, я пишу 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);
    }

0 ответов

Другие вопросы по тегам