Как заставить шейдер исчезнуть, отправив данные только один раз? - PullRequest
0 голосов
/ 12 сентября 2018

Я испытываю затруднения, заставляя квадрат плавно переходить в черный цвет, используя исключительно шейдеры. Я использую OpenGL в сочетании с C ++ и Qt. Что мне нужно сделать, это отправить список вершин в GPU один раз и сделать только один вызов отрисовки. Используя этот список вершин, мне нужно, чтобы квадрат стал черным за определенное время. Это возможно при использовании только шейдеров OpenGL? Я не хочу делать это на стороне процессора, потому что он является частью более крупного приложения и делает его чрезвычайно медленным. Как сделать затенение шейдера без отправки ему новых потертых значений?

1 Ответ

0 голосов
/ 12 сентября 2018

Эффект затухания легко делается в фрагментном шейдере.

У вас есть таймер в процессоре. Каждый раз, когда он срабатывает, вы уменьшаете переменную remainingPercent, означающую, сколько «белого» (в отличие от черного) вы хотите видеть в окне. Пусть это значение будет в диапазоне [0, 1,0].

Каждый раз, когда срабатывает таймер, вы просто связываете VAO и вызываете glDrawXX, нет необходимости снова заполнять буферы. И вызывайте свопбуферы.

Вы передаете это remainingPercent значение с помощью glUniform в шейдер. Последний шаг - это смешивание текущего цвета с полным черным по величине этой униформы. Что-то вроде:

float uniform fadeOut;
in vec4  fragColor;
out vec4 finalColor;
....
finalColor = mix(vec4(0.0), fragColor, fadeOut);
...