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.