首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jogl gldrawpixels()问题

Jogl gldrawpixels()问题
EN

Stack Overflow用户
提问于 2011-06-21 02:39:03
回答 1查看 1.3K关注 0票数 1

我希望这是一个简单的问题。

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

这是我的问题:当我尝试使用glDrawPixels()时,我的glCanvas是稀疏填充的,而不是完全填充的。正如你所看到的,在进入更复杂的内容之前,我目前正在尝试获得一个简单的绘图案例。我用一个填充的字节的值填充一个一维字节数组。接下来,我将其传递给glDrawPixels()以写入颜色缓冲区。

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

此外,该方法似乎期望的数据是您指定给它的维度的两倍。例如,您可以在这里看到,尽管我告诉它按高度管理宽度的区域,但它会抛出异常,除非字节数组实际上是宽度的两倍,也就是高度的两倍。

我使用glDrawPixels()是因为我读到它是管理像素的正确方法。

代码语言:javascript
复制
        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)。也就是说,我不想在片段着色器中这样做。耽误您时间,实在对不起。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-21 02:45:52

您的缓冲区布局错误。n×m个像素和每个像素k个字节的图像具有n*m*k个元素。要访问缓冲区,您必须将width*y +x元素向前推进。尽管传递了正确的缓冲区大小和参数,但任何缓冲区溢出都是由于错误的像素解包设置造成的。

因此,将其更改为:

代码语言:javascript
复制
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));
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6415821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档