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