Использование буферизованного изображения более высокой точности (чем 8-разрядное целое число без знака) для карт высот в Java

8

Я генерирую карту высот для каждого квада в своем квадродереве в openCL. То, как я создавал изображение, выглядит следующим образом:

DataBufferInt dataBuffer =
            (DataBufferInt)img.getRaster().getDataBuffer();
      int data[] = dataBuffer.getData();
      //img is a bufferedimage 
        inputImageMem = CL.clCreateImage2D(
        context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR,
        new cl_image_format[]{imageFormat}, size, size,
        size * Sizeof.cl_uint, Pointer.to(data), null);

Это работает нормально, но основная проблема заключается в том, что по мере того, как четырехугольники становятся все меньше и меньше, 8-битный формат буферизованного изображения начинает вызывать недопустимые проблемы с «переходом», как показано ниже:

введите описание изображения здесь

Мне было интересно, есть ли альтернативный способ сделать это?

Спасибо за время.

PL12
источник
Вы говорите об этом "шагании"? i.imgur.com/Sx9egmm.png?1
MichaelHouse
Да, это так.
pl12
Можете ли вы изменить название на что-то более связанное с вашим вопросом? Я пытался что-то придумать, но не хотел неправильно истолковать твой вопрос.
MichaelHouse
Ах да, определенно
PL12
Почему вы должны использовать BufferedImage? В каком формате ваши входные изображения?
msell

Ответы:

1

Используете ли вы фильтрацию текстур при чтении карты высот? Я ожидаю, что билинейный фильтр немного сгладит.

Если вам все еще нужна более высокая точность, измените формат изображения на что-то вроде CL_UNORM_INT16 или CL_FLOAT - см. Http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/cl_image_format.html.

Я не совсем уверен, как вы делаете это с Java, хотя.

Адам
источник
Да, это проблема: я не могу понять, как использовать что-либо, кроме 8-битного целого числа с BufferedImage.
pl12
Поскольку Java не имеет встроенной поддержки OpenCL, это может помочь узнать, какую библиотеку вы используете. Другой вариант - использовать изображение двойной ширины и декодировать его, например, на GPU (pixel [x] /256.0 + pixel [x + 1]).
Адам
Я попытался использовать билинейную интерполяцию без удачи ... Я просто использую Java OpenCL (JOCL)
pl12
Java-версия OpenCL также поддерживает эти форматы. cl_image_formatимеет image_channel_data_typeчлен, который может использоваться для указания формата данных (например, CL_FLOATи т. д.)
bummzack
2
docs.oracle.com/javase/7/docs/api/java/awt/image/… говорит, что BufferedImage поддерживает TYPE_USHORT_GREY, который является 16-битным.
Адам