首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glDrawPixels的错误像素位置

glDrawPixels的错误像素位置
EN

Stack Overflow用户
提问于 2012-07-05 15:00:52
回答 3查看 1.5K关注 0票数 2

我一直在尝试使用java和lwjgl在opengl中绘制一个320x240的全屏幕分辨率图像。我将分辨率设置为640x480,并将像素大小加倍以填充空间。经过大量的谷歌搜索,我发现了一些关于使用glDrawPixels函数来加速绘制到屏幕的信息。我想通过给屏幕上的所有像素随机分配颜色来测试它,但它不会填满整个屏幕。我将宽度划分为4个部分,每个部分80个像素,并将它们分别着色为红色、绿色、蓝色和白色。我看到我在交错颜色,但我不知道怎么做。

以下是输出的图像:

下面是我运行openGL代码的地方:

代码语言:javascript
复制
// init OpenGL
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, 640, 0, 480, 1, -1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);

while (!Display.isCloseRequested()) {
    pollInput();

    // Clear the screen and depth buffer
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);  



    randomizePixels();
    GL11.glRasterPos2i(0, 0);

    GL11.glDrawPixels(320, 240,GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE,buff);

    GL11.glPixelZoom(2, 2);


    Display.update();   
}
Display.destroy();
}

这里是我创建像素颜色数据的地方:

代码语言:javascript
复制
public void randomizePixels(){
    for(int y = 0; y < 240; y++){
        for(int x = 0; x < 320; x+=4){
            /*
            pixels[x * 320 + y] = (byte)(-128 + ran.nextInt(256));
            pixels[x * 320 + y + 1] = (byte)(-128 + ran.nextInt(256));
            pixels[x * 320 + y + 2] = (byte)(-128 + ran.nextInt(256));
            pixels[x * 320 + y + 3] = (byte)(-128 + ran.nextInt(256));
            */

            if(x >= 0 && x < 80){
                pixels[y * 240 + x] = (byte)128;
                pixels[y * 240 + x + 1] = (byte)0;
                pixels[y * 240 + x + 2] = (byte)0;
                pixels[y * 240 + x + 3] = (byte)128;
            }else if(x >= 80 && x < 160){
                pixels[y * 240 + x] = (byte)0;
                pixels[y * 240 + x + 1] = (byte)128;
                pixels[y * 240 + x + 2] = (byte)0;
                pixels[y * 240 + x + 3] = (byte)128;
            }else if(x >= 160 && x < 240){
                pixels[y * 240 + x] = (byte)0;
                pixels[y * 240 + x + 1] = (byte)0;
                pixels[y * 240 + x + 2] = (byte)128;
                pixels[y * 240 + x + 3] = (byte)128;
            }else if(x >= 240 && x < 320){
                pixels[y * 240 + x] = (byte)128;
                pixels[y * 240 + x + 1] = (byte)128;
                pixels[y * 240 + x + 2] = (byte)128;
                pixels[y * 240 + x + 3] = (byte)128;
            }

        }
    }
    buff.put(pixels).flip();
}

如果你能找出为什么我不能让像素对齐到x和y坐标,我想让它们对齐,那就太好了。我读到过glDrawPixels可能不是将像素绘制到屏幕上的最好或最快的方法,但在我不得不转向其他方法之前,我想了解一下为什么我会遇到这个特殊的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-06 00:25:32

我在你的randomizePixels()中发现了两个问题。

1.索引像素缓冲区

由于像素类型为GL_RGBA,因此像素缓冲区的总大小为320x240x4字节。因此,使用下标运算符[]索引每个像素,它将是;

代码语言:javascript
复制
for(int y = 0; y < 240; y++)
{
    for(int x = 0; x < 320; x++)
    {
        pixels[y * 320 * 4 + x * 4 + 0] = ... // R
        pixels[y * 320 * 4 + x * 4 + 1] = ... // G
        pixels[y * 320 * 4 + x * 4 + 2] = ... // B
        pixels[y * 320 * 4 + x * 4 + 3] = ... // A
    }
}

2.颜色值

8bit颜色的最大亮度为255,例如,不透明的红色像素将为(255,0,0,255)。

票数 2
EN

Stack Overflow用户

发布于 2012-07-05 16:59:06

只需加载您的图像(未缩放)到一个纹理,并绘制一个纹理四边形。

不要使用glDrawPixels。此函数在大多数驱动程序中从未正确优化过,自OpenGL-2以来已被弃用,并从OpenGL-3核心及更高版本中删除。

票数 4
EN

Stack Overflow用户

发布于 2012-07-05 17:20:12

你对纹理的操作。最好在求积上做。它会产生很好的效果

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11339273

复制
相关文章

相似问题

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