【问题标题】:Wrong pixel locations with glDrawPixelsglDrawPixels 错误的像素位置
【发布时间】:2012-07-05 07:00:51
【问题描述】:

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

这是输出的图像:

这里是我运行 openGL 代码的地方:

// 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();
}

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

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 可能不是将像素绘制到屏幕上的最佳或最快方法,但我想了解为什么在我不得不转向其他方法之前会遇到这个特殊问题。

【问题讨论】:

    标签: opengl lwjgl gldrawpixels


    【解决方案1】:

    只需将您的图像(未缩放)加载到纹理中并绘制带纹理的四边形。

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

    【讨论】:

    • 我得到了一个带纹理的四边形版本,并整理了如何使它在放大时看起来像素化(最初在放大时变得模糊)。但是 glDrawPixel 和 Textured Quads 程序都以 60fps 运行。我认为,但我不确定,不是专家,openGL 或 jlwgl 是否将它们限制为 60fps。如何让它们全速运行以确定哪个运行得更快?我打算最终将其降低到 30fps,但我认为更快的像素绘制时间会为其他计算留出更多时间。
    【解决方案2】:

    我在您的 randomizePixels() 中发现了 2 个问题。

    1。索引像素缓冲区

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

    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。颜色值

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

    【讨论】:

    • 谢谢,我担心我弄错了缓冲区,转换为纹理四边形无法解决这个问题。我一直在使用 128,因为我认为我无法在 java 中获得无符号字节并且必须在 -128 到 127 的范围内工作,我认为 openGL 会将其转换为正常的 0 到 255 范围,我错了吗?
    • 编辑:我检查过,255 工作正常,我的白色更白,所有颜色都完全符合预期。我现在将尝试将其转换为带纹理的四边形。
    【解决方案3】:

    您对纹理的操作。最好在正交上做。会有好的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多