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

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

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

Вы видите, что две сосны отражаются справа? Я хотел бы иметь что-то подобное:

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

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

1 ответ

Решение

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

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

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

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

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

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