Jogl gldrawpixels () проблема - PullRequest
1 голос
/ 20 июня 2011

Я надеюсь, что это в конечном итоге простой вопрос.

Я использую JOGL в Netbeans для создания шахматной доски пикселей, где вы можете указать количество плиток в каждой строке / столбце, а такжецвет каждой из этих плиток (нарисуйте эту плитку с 0 альфа, нарисуйте эту плитку с полной альфа).Скорость не проблема и не эффективность.

Вот моя проблема: когда я пытаюсь использовать glDrawPixels (), мой glCanvas не полностью, а полностью заполнен.Как вы можете видеть, я сейчас пытаюсь получить простой пример работы чертежа, прежде чем перейти к более сложным вещам.Я заполняю массив 1D байтов значением заполненного байта.Затем я передаю это glDrawPixels () для записи в буфер цвета.

Я неправильно обрабатываю байтовый массив?На практике (в отличие от нескольких учебных пособий, которые я видел), метод принимает форму буфера только для фактических данных, поэтому я обернул байтовый массив.

Кроме того, кажется, что методожидать в два раза больше данных, чем указано вами.Например, вы можете видеть здесь, что, хотя я говорю ему управлять областью ширины по высоте, она выдает исключение, если массив байтов не удваивает ширину на удвоенную высоту.

Я использую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).При этом я бы предпочел не делать это в фрагментном шейдере.Спасибо за ваше время.

1 Ответ

4 голосов
/ 20 июня 2011

Ваш макет буфера неправильный.Изображение 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));
...