Javaでの高さマップ用の高精度(8ビットの符号なし整数)バッファーイメージの使用


8

openCLでクワッドツリーのすべてのクワッドの高さマップを生成しています。私がイメージを作成していた方法は次のとおりです。

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

これは問題なく動作しますが、主な問題は、クワッドが次第に小さくなるにつれて、バッファされたイメージの8ビット形式が次のように許容できない「ステッピング」問題を引き起こし始めることです。

ここに画像の説明を入力してください

私がこれをやり遂げることができる別の方法があるかどうか私は思っていましたか?

時間をありがとう。


これはあなたが話している「足踏み」ですか?i.imgur.com/Sx9egmm.png?1
MichaelHouse

はい、そうです。
pl12 2013

タイトルを質問に関連するものに変更できますか?私は何かを考え出そうとしていましたが、あなたの質問を誤解したくありませんでした。
MichaelHouse

はい、間違いなく
pl12

なぜBufferedImageを使用する必要があるのですか?入力画像はどの形式ですか?
msell 2013

回答:


1

高さマップを読み取るときにテクスチャフィルタリングを使用していますか?バイリニアフィルターを使用すると、処理が少しスムーズになると思います。

それでも精度を上げる必要がある場合は、画像形式をCL_UNORM_INT16やCL_FLOATなどに変更してください -http : //www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/cl_image_format.htmlを参照してください

あなたがJavaからそれをどのように行うのかはよくわかりません。


それが問題です。BufferedImageで8ビット整数以外を使用する方法がわかりません。
pl12 2013

JavaはOpenCLをネイティブでサポートしていないため、どのライブラリを使用しているかを知ることが役立つ場合があります。もう1つのオプションは、倍幅の画像を使用し、GPUでそれをデコードすることです(pixel [x] /256.0 + pixel [x + 1])。
アダム

運が悪い状態でバイリニア補間を使用してみました... Java OpenCL(JOCL)を使用しています
pl12

OpenCLのJavaバージョンは、これらのフォーマットもサポートしているようです。cl_image_format有するimage_channel_data_typeデータフォーマットを指定するために使用することができる部材(例えば、CL_FLOAT等)
bummzack

2
docs.oracle.com/javase/7/docs/api/java/awt/image/…は、BufferedImageが16ビットのTYPE_USHORT_GREYをサポートしていると述べています。
アダム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.