Verwenden eines gepufferten Bilds mit höherer Genauigkeit (als vorzeichenlose 8-Bit-Ganzzahl) für Höhenkarten in Java

8

Ich generiere eine Höhenkarte für jedes Quad in meinem Quadtree in openCL. Ich habe das Bild folgendermaßen erstellt:

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

Dies funktioniert in Ordnung, aber das Hauptproblem ist, dass das 8-Bit-Format des gepufferten Bildes, wenn die Quads immer kleiner werden, unerträgliche "Schritt" -Probleme verursacht, wie unten dargestellt:

Geben Sie hier die Bildbeschreibung ein

Ich habe mich gefragt, ob es einen alternativen Weg gibt, dies zu tun.

Danke für die Zeit.

pl12
quelle
Ist das das "Treten", von dem du sprichst? i.imgur.com/Sx9egmm.png?1
MichaelHouse
Ja, das ist es.
pl12
Können Sie den Titel in etwas ändern, das mehr mit Ihrer Frage zu tun hat? Ich habe versucht, mir etwas auszudenken, wollte aber Ihre Frage nicht falsch interpretieren.
MichaelHouse
Oh ja definitiv
pl12
Warum müssen Sie ein BufferedImage verwenden? Welches Format haben Ihre Eingabebilder?
Msell

Antworten:

1

Verwenden Sie beim Lesen der Höhenkarte eine Texturfilterung? Ich würde erwarten, dass ein bilinearer Filter die Dinge ein wenig glätten würde.

Wenn Sie immer noch eine bessere Genauigkeit benötigen, ändern Sie das Bildformat in CL_UNORM_INT16 oder CL_FLOAT - siehe http://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/cl_image_format.html

Ich bin mir nicht ganz sicher, wie Sie das mit Java machen.

Adam
quelle
Ja, das ist das Problem: Ich kann nicht herausfinden, wie ich etwas anderes als eine 8-Bit-Ganzzahl mit einem BufferedImage verwenden kann.
12.
Da Java keine native OpenCL-Unterstützung bietet, ist es möglicherweise hilfreich zu wissen, welche Bibliothek Sie verwenden. Die andere Möglichkeit wäre, ein Bild mit doppelter Breite zu verwenden und es auf der GPU wie folgt zu dekodieren (Pixel [x] / 256,0 + Pixel [x + 1]).
Adam
Ich habe ohne Glück versucht, bilineare Interpolation zu verwenden ... Ich verwende nur Java OpenCL (JOCL)
pl12
Die Java-Version von OpenCL scheint diese Formate ebenfalls zu unterstützen. cl_image_formathat ein image_channel_data_typeMitglied, das verwendet werden kann, um das Datenformat anzugeben (z. B. CL_FLOATusw.)
bummzack
2
Laut docs.oracle.com/javase/7/docs/api/java/awt/image/… unterstützt BufferedImage TYPE_USHORT_GREY (16-Bit).
Adam