我希望这最终成为一个简单的问题。
我在Netbeans中使用JOGL来创建像素棋盘,您可以在其中指定每行/列中的图块数量,以及每个图块的颜色(使用0 alpha绘制此图块,绘制该图块)完整的阿尔法)。速度不是问题,效率也不是问题。
这是我的问题:当我尝试使用glDrawPixels()时,我的glCanvas稀疏地填充而不是完全填充。正如你所看到的那样,我现在正试图在绘制更复杂的内容之前,先了解一个简单的绘图工作。我正在用填充字节的值填充一维字节数组。接下来,我将它赋予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)。话虽如此,我宁愿不在片段着色器中这样做。谢谢你的时间。
答案 0 :(得分:4)
您的缓冲区布局错误。每像素n×m像素和k字节的图像具有n * m * k个元素。要访问缓冲区,您必须前进宽度* 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));