Uso de una imagen de mayor precisión (que un entero sin signo de 8 bits) para mapas de altura en Java

8

Estoy generando un mapa de altura para cada quad en mi quadtree en openCL. La forma en que estaba creando la imagen es la siguiente:

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

Esto funciona bien, pero el problema principal es que a medida que los quads se vuelven cada vez más pequeños, el formato de 8 bits de la imagen almacenada comienza a causar problemas intolerables de "escalonamiento" como se ve a continuación:

ingrese la descripción de la imagen aquí

Me preguntaba si habría una forma alternativa de hacer esto.

Gracias por el tiempo.

pl12
fuente
¿Es este el "paso" del que estás hablando? i.imgur.com/Sx9egmm.png?1
MichaelHouse
Si, eso es.
pl12
¿Puedes cambiar el título a algo más relacionado con tu pregunta? Estaba tratando de llegar a algo, pero no quería malinterpretar su pregunta.
MichaelHouse
Oh sí definitivamente
pl12
¿Por qué tienes que usar una imagen almacenada? ¿De qué formato son sus imágenes de entrada?
msell

Respuestas:

1

¿Estás usando el filtrado de texturas al leer el mapa de altura? Esperaría que un filtro bilineal suavizara un poco las cosas.

Si aún necesita una mayor precisión, cambie el formato de la imagen a algo como CL_UNORM_INT16 o CL_FLOAT: consulte http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/cl_image_format.html

Sin embargo, no estoy muy seguro de cómo lo haces desde Java.

Adán
fuente
Sí, ese es el problema: no puedo entender cómo usar otra cosa que no sea un entero de 8 bits con una imagen almacenada.
pl12
Como Java no tiene soporte nativo para OpenCL, puede ser útil saber qué biblioteca está utilizando. La otra opción sería usar una imagen de doble ancho y decodificarla en la GPU como por ejemplo (pixel [x] /256.0 + pixel [x + 1]).
Adam
Intenté usar interpolación bilineal sin suerte ... Solo estoy usando Java OpenCL (JOCL)
pl12
La versión Java de OpenCL parece admitir también estos formatos. cl_image_formattiene un image_channel_data_typemiembro que se puede usar para especificar el formato de datos (por ejemplo, CL_FLOATetc.)
bummzack
2
docs.oracle.com/javase/7/docs/api/java/awt/image/… dice que BufferedImage admite TYPE_USHORT_GREY, que es de 16 bits.
Adam