1

これが簡単な質問で終わることを願っています。

Netbeans で JOGL を使用して、各行/列のタイル数と、これらの各タイルの色を指定できるピクセルのチェッカーボードを作成しています (このタイルを 0 アルファで描画し、そのタイルをフル アルファで描画します)。 )。速度も効率も問題ではありません。

ここに私の問題があります: glDrawPixels() を使用しようとすると、私の glCanvas は完全に埋められるのではなく、まばらに埋められます。ご覧のとおり、私は現在、より複雑な作業に移る前に、図面が機能する簡単なケースを取得しようとしています。埋められたバイトの値で 1D バイト配列を埋めています。次に、これを glDrawPixels() に渡して、カラー バッファーに書き込みます。

バイト配列を正しく処理していませんか? 実際には (私が見たいくつかのチュートリアルとは対照的に)、メソッドは実際のデータの Buffer の形式しかとらないため、バイト配列をまとめました。

また、メソッドは、指定したディメンションの 2 倍のデータを期待しているようです。たとえば、ここでは、幅の領域を高さで管理するように指示していますが、バイト配列が実際には幅の 2 倍、高さの 2 倍でない限り、例外がスローされることがわかります。

glDrawPixels() を使用しているのは、それがピクセルを管理する正しい方法であることを読んだからです。

        byte[] src = new byte[(width*2)*(height*2)];

        for(int a=0; a<height*2; a++){
            for(int b=0; b<width*2; b++){
                src[a*b+b]= 127;
            }
        }

        gl.glDrawPixels(width, height,
                GL.GL_RED, GL.GL_UNSIGNED_BYTE,
                ByteBuffer.wrap(src));

幅と高さはキャンバスの寸法 (256x256) であるため、この操作はキャンバスの領域全体を占めることに注意してください。

あなたが私に与えることができるどんな助けにも本当に感謝します. まったく異なるアプローチを含むソリューションには問題ありません (JOGL を使用することを意味している限り)。そうは言っても、フラグメントシェーダーではこれを行いたくありません。御時間ありがとうございます。

4

1 に答える 1

4

バッファ レイアウトが間違っています。n×m ピクセルでピクセルあたり k バイトのイメージには、n*m*k 要素があります。バッファにアクセスするには、 width*y + x 要素を進める必要があります。適切なバッファー サイズとパラメーターが渡されたにもかかわらず、バッファー オーバーランが発生するのは、不適切なピクセル アンパック設定が原因です。

したがって、これを次のように変更します。

byte[] src = new byte[width*height];

    for(int a=0; a<height; a++){
        for(int b=0; b<width; b++){
            src[a*width+b]= 127;
        }
    }

    gl.glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    gl.glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
    gl.glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);

    gl.glDrawPixels(width, height,
            GL.GL_RED, GL.GL_UNSIGNED_BYTE,
            ByteBuffer.wrap(src));
于 2011-06-20T18:45:51.587 に答える