Utilizzo di un'immagine con buffer di precisione superiore (rispetto all'intero senza segno a 8 bit) per le mappe di altezza in Java


8

Sto generando una heightmap per ogni quad nel mio quadtree in openCL. Il modo in cui stavo creando l'immagine è il seguente:

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

Funziona bene, ma il problema principale è che man mano che i quad diventano sempre più piccoli, il formato a 8 bit dell'immagine bufferizzata inizia a causare problemi di "stepping" intollerabili come mostrato di seguito:

inserisci qui la descrizione dell'immagine

Mi chiedevo se ci fosse un modo alternativo per fare questo?

Grazie per il tempo.


È questo il "passo" di cui stai parlando? i.imgur.com/Sx9egmm.png?1
MichaelHouse

Sì, lo è.
pl12

Puoi cambiare il titolo in qualcosa di più legato alla tua domanda? Stavo cercando di trovare qualcosa ma non volevo interpretare male la tua domanda.
MichaelHouse

Oh sì, sicuramente
pl12,

Perché devi usare un BufferedImage? In quale formato sono le tue immagini di input?
msell

Risposte:


1

Stai utilizzando il filtro trama durante la lettura della mappa di altezza? Mi aspetto che un filtro bilineare appianerebbe un po 'le cose.

Se hai ancora bisogno di una maggiore precisione, modifica il formato dell'immagine in qualcosa come CL_UNORM_INT16 o CL_FLOAT - vedi http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/cl_image_format.html

Non sono del tutto sicuro di come lo faccia da Java.


Sì, questo è il problema: non riesco a capire come usare qualcosa di diverso dall'intero a 8 bit con BufferedImage.
pl12

Poiché Java non ha il supporto OpenCL nativo, potrebbe essere utile sapere quale libreria stai utilizzando. L'altra opzione sarebbe quella di utilizzare un'immagine a doppia larghezza e decodificarla sulla GPU come dire (pixel [x] /256.0 + pixel [x + 1]).
Adamo,

Ho provato a usare l'interpolazione bilineare senza fortuna ... Sto solo usando Java OpenCL (JOCL)
pl12

La versione Java di OpenCL sembra supportare anche questi formati. cl_image_formatha un image_channel_data_typemembro che può essere utilizzato per specificare il formato dei dati (es. CL_FLOATecc . )
bummzack

2
docs.oracle.com/javase/7/docs/api/java/awt/image/… afferma che BufferedImage supporta TYPE_USHORT_GREY che è a 16 bit.
Adam,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.