Неправильные положения пикселей с glDrawPixels

Я пытался нарисовать изображение с полным разрешением экрана 320 на 240 в opengl, используя java и lwjgl. Я установил разрешение 640 на 480 и удвоил размер пикселей, чтобы заполнить пространство. После долгих поисков в Google я нашел некоторую информацию об использовании функции glDrawPixels для ускорения рисования на экране. Я хотел проверить это, назначив случайные цвета всем пикселям на экране, но он не заполнил весь экран. Я разделил ширину на 4 секции по 80 пикселей каждая и покрасил их в красный, зеленый, синий и белый цвета. Я видел, что я чередовал цвета, но я не могу понять, как.

Вот изображение вывода:

IMG

Вот где я запускаю код 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, вероятно, не самый лучший или самый быстрый способ рисования пикселей на экране, но я хочу понять, почему у меня возникла эта конкретная проблема, прежде чем перейти к какому-либо другому методу.

3 ответа

Решение

Я замечаю 2 проблемы в вашем randomizePixels(),

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).

Просто загрузите ваше изображение (немасштабированное) в текстуру и нарисуйте текстурированный квад.

Не использовать glDrawPixels, Эта функция никогда не была должным образом оптимизирована в большинстве драйверов и устарела после OpenGL-2 и была удалена из ядра OpenGL-3 и более поздних версий.

Вы работаете над текстурой. лучше сделай это на квадратуре. это дало бы хорошие результаты

Другие вопросы по тегам