В настоящее время я реализую независимый от порядка рендеринг прозрачных 3D-объектов, и мне приходит в голову все больше и больше вопросов.
Вот как работает мой рендеринг:
Сначала я отрисовываю все непрозрачные объекты. Затем я хочу отобразить все прозрачные объекты, где я не хочу выводить цвет, а скорее записать данные фрагмента в связанный список. На третьем этапе рендеринга я рендерил четырехугольник размером с экран, где сортировал фрагменты одного пикселя, а затем смешивал их с некоторой функцией.
Мой первый вопрос сейчас: если я не хочу выводить цвета на втором проходе рендеринга, мне нужны два разных шейдера, один для непрозрачных и один для прозрачных объектов, верно? Это требует больших усилий, особенно когда непрозрачность объектов может меняться во время выполнения. Таким образом, я должен был проверить каждый кадр, какой шейдер я хочу использовать. Это действительно путь?
Второй вопрос: если я вычисляю окончательный цвет пикселей с прозрачными объектами на них на третьем проходе, мне нужно прочитать текущий кадровый буфер, чтобы смешать значения непрозрачных объектов в цвете. Это означает, что мне нужно будет отобразить все в объект framebuffer (по крайней мере, так он называется в OpenGL), а затем скопировать весь кадровый буфер в системный кадровый буфер. Разве это не огромная потеря производительности?
Третий вопрос: это касается моего второго вопроса. Весь этот процесс кажется чрезвычайно дорогостоящим по сравнению с простым двухпроходным методом. Действительно ли это стоит немного лучшего внешнего вида прозрачных объектов?