Usando uma Imagem Buffered de Maior Precisão (com número inteiro não assinado de 8 bits) para mapas de altura em Java

8

Estou gerando um mapa de altura para cada quad no meu quadtree no openCL. A maneira como eu estava criando a imagem é a seguinte:

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);

Isso funciona bem, mas o principal problema é que, à medida que os quads ficam cada vez menores, o formato de 8 bits da imagem em buffer começa a causar problemas intoleráveis ​​de "etapas", como visto abaixo:

insira a descrição da imagem aqui

Eu queria saber se havia uma maneira alternativa que eu poderia fazer isso?

Obrigada pelo tempo.

pl12
fonte
É sobre isso que você está falando? i.imgur.com/Sx9egmm.png?1
MichaelHouse
Sim, é isso mesmo.
PL12
Você pode alterar o título para algo mais relacionado à sua pergunta? Eu estava tentando criar algo, mas não queria interpretar mal sua pergunta.
Michaelhouse
Oh sim, definitivamente
PL12
Por que você precisa usar uma BufferedImage? Que formato são as suas imagens de entrada?
msell

Respostas:

1

Você está usando filtragem de textura ao ler o mapa de altura? Eu esperaria que um filtro bilinear suavizasse um pouco as coisas.

Se você ainda precisar de mais precisão, altere o formato da imagem para algo como CL_UNORM_INT16 ou CL_FLOAT - consulte http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/cl_image_format.html

Não tenho muita certeza de como você faz isso do Java.

Adão
fonte
Sim, esse é o problema: não consigo descobrir como usar nada além de um número inteiro de 8 bits com uma BufferedImage.
PL12
Como o Java não possui suporte OpenCL nativo, pode ser útil saber qual biblioteca você está usando. A outra opção seria usar uma imagem de largura dupla e decodificá-la na GPU, como se diz (pixel [x] /256.0 + pixel [x + 1]).
Adam
Eu tentei usar interpolação bilinear sem sorte ... Estou apenas usando Java OpenCL (JOCL)
PL12
A versão Java do OpenCL parece suportar também esses formatos. cl_image_formattem um image_channel_data_typemembro que pode ser usado para especificar o formato de dados (por ex. CL_FLOAT, etc)
bummzack
2
docs.oracle.com/javase/7/docs/api/java/awt/image/… diz que o BufferedImage suporta TYPE_USHORT_GREY, que é de 16 bits.
Adam