Opengl, Ruby, glBlendFunc: размещайте прозрачные изображения друг над другом, как если бы они были непрозрачными.

Я не уверен, что glBlendFunc — отличная функция для решения моей проблемы, но я думаю, что она мне понадобится! Вот моя проблема:

введите здесь описание изображения

Видишь отражение двух сосен справа? Я хотел бы иметь что-то вроде этого:

введите здесь описание изображения

Затем мне нужен метод, который делает то же отображение, что и для непрозрачного изображения, но с прозрачным изображением. Есть ли в glBlendFunc какая-то особая комбинация или нужно действовать другими способами?


person Nat    schedule 21.08.2014    source источник


Ответы (1)


Я не думаю, что чистый подход к смешиванию будет работать. В случае, когда у вас есть два перекрывающихся отражения деревьев, первое после рендеринга смешивается с водой. Когда вы рисуете второе дерево, вы хотите, чтобы только второе дерево смешивалось с водой. Но цвет воды в фреймбуфере уже был смешан с первым деревом, поэтому сам по себе цвет воды больше не находится в фреймбуфере.

На ум приходят три подхода:

  1. Нарисуйте все отражения деревьев в FBO без смешивания. Затем нарисуйте результат поверх воды с включенным смешиванием.

  2. Держите тестирование глубины включенным (если оно у вас сейчас отключено) при рисовании отражений. Нарисуйте отражения деревьев спереди назад, с небольшим смещением относительно поверхности воды, с уменьшением смещения для каждого нарисованного отражения. Таким образом, отражения более близких деревьев будут скрывать отражения деревьев, которые находятся дальше.

  3. Аналогично варианту 2. Но вместо теста смещения и глубины используйте тест трафарета, чтобы убедиться, что в каждом пикселе отображается только одно отраженное дерево.

person Reto Koradi    schedule 24.08.2014
comment
Огромное спасибо! Я сделал ваше второе решение, и оно сработало отлично! На самом деле у меня уже было смещение по оси Y, но оно увеличивалось после каждого отражения. Кроме того, я плохо прочитал массив спрайтов, теперь отражение идеальное! - person Nat; 24.08.2014