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.


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.