Jogl gldrawpixels() проблема

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

Я использую 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 ответ

Решение

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