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:
Me preguntaba si habría una forma alternativa de hacer esto.
Gracias por el tiempo.
Respuestas:
¿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.
fuente
cl_image_format
tiene unimage_channel_data_type
miembro que se puede usar para especificar el formato de datos (por ejemplo,CL_FLOAT
etc.)