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.


É 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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.