Slick2d / LWJGL Настройка альфа-канала в слое OpenGL (Java)

#java #opengl #lwjgl #alpha #slick2d

#java #opengl #lwjgl #альфа #slick2d

Вопрос:

Я прошу прощения за некоторое мое невежество, поскольку я довольно новичок в Slick2D и LWJGL. По сути, я пытаюсь сделать сцену похожей на ночное время, закрыв ее прямоугольником GL_QUADS, который окрашен в синий цвет и является полупрозрачным.

Эта часть достаточно проста. Что я хочу сделать оттуда, так это нарисовать треугольники в этом слое, которые так изменяют альфа-канал. Причина, по которой я хочу это сделать, заключается в том, что я могу имитировать источник света, уменьшая непрозрачность синего прямоугольника по мере приближения к источнику света.

Я нарисовал пример того, каким должен быть ожидаемый результат: зеленый цвет является фоном, синий — ночным эффектом, создаваемым синим прямоугольником, и все более тусклым источником света в центре.

Мне нужно найти способ сделать это с помощью треугольников, потому что я создал алгоритм raycasting, который генерирует результат в виде серии градиентных треугольников.

Прошу прощения, если это плохо объяснено. Я отвечу на любые ваши вопросы.

Предполагаемый результат

Вот фрагмент кода, используемый для создания синего прямоугольника:

     glColor4f (0.0f,0.0f,1.0f,0.4f);
    glBegin(GL_QUADS);
    glVertex2f(0,0);
    glVertex2f(screenWidth,0);
    glVertex2f(screenWidth,screenHeight);
    glVertex2f(0,screenHeight);
    glEnd();
 

Я хотел бы написать модифицированную версию следующего кода для настройки альфа-канала этого прямоугольника.

     glBegin(GL_TRIANGLES);
    setAlphaOfPriorLayer(0.0f);
    glVertex2f(x1,y1);
    setAlphaOfPriorLayer(0.4f);
    glVertex2f(x2,y2);
    setAlphaOfPriorLayer(0.4f);
    glVertex2f(x3,y3);
    glEnd();
 

Опять же, я использую треугольники для аппроксимации круга и обеспечения правильного радиовещания.

Ответ №1:

Для достижения этой цели использование объекта Frame Buffer очень полезно. FBO позволяет вам по существу отображать текстуру, которая затем может отображаться на экране. В моем конкретном случае я визуализировал элементы в FBO, а затем использовал шейдер при выводе его на экран, чтобы получить желаемую прозрачность.