1

我希望这最终成为一个简单的问题。

我在 Netbeans 中使用 JOGL 来创建一个像素棋盘,您可以在其中指定每行/列中的图块数量,以及每个图块的颜色(用 0 alpha 绘制这个图块,用完整的 alpha 绘制那个图块)。速度不是问题,效率也不是问题。

这是我的问题:当我尝试使用 glDrawPixels() 时,我的 glCanvas 被稀疏填充而不是完全填充。正如你所看到的,我目前正在尝试制作一个简单的绘图案例,然后再进行更多涉及的内容。我正在用填充字节的值填充一维字节数组。接下来,我将其交给 glDrawPixels() 以写入颜色缓冲区。

我是否错误地处理了字节数组?在实践中(与我见过的几个教程相反),该方法只对实际数据采用 Buffer 的形式,所以这就是我包装字节数组的原因。

此外,该方法似乎期望的数据是您为其指定的维度的两倍。例如,您可以在此处看到,尽管我告诉它管理一个宽高的区域,但它会引发异常,除非字节数组实际上是宽度的两倍和高度的两倍。

我使用 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 回答