Как графические процессоры PowerVR обеспечивают буфер глубины?
Устройства iOS используют графическую архитектуру PowerVR. Архитектура PowerVR - это модель отложенного рендеринга на основе тайлов. Основным преимуществом этой модели является то, что она не использует буфер глубины.
Тем не менее, я могу получить доступ к буферу глубины на моем устройстве iOS. В частности, я могу использовать внеэкранный объект Frame Buffer, чтобы превратить буфер глубины в цветную текстуру и отобразить его.
Если архитектура PowerVR не использует буфер глубины, как я могу рендерить буфер глубины?
3 ответа
Это правда, что рендереру на основе плиток для работы не нужен традиционный буфер глубины.
TBR разделяет экран на плитки и полностью отображает содержимое этой плитки, используя быструю встроенную память для хранения временных цветов и глубин. Затем, когда плитка закончена, окончательные значения перемещаются в фактический кадровый буфер. Однако значения глубины в буфере глубины традиционно являются временными, поскольку они просто используются в качестве алгоритма скрытой поверхности. Тогда значения глубины в этом случае могут быть полностью отброшены после рендеринга тайла.
Это означает, что фактически рендерерам на основе плиток на самом деле не нужен полноэкранный буфер глубины в медленной видеопамяти, что экономит как пропускную способность, так и память.
Metal API легко предоставляет эту функциональность, позволяя установить для storeAction буфера глубины значение "пофиг", что означает, что он не будет резервировать полученные значения глубины в основную память.
Исключением из этого случая является то, что вам может понадобиться содержимое буфера глубины после рендеринга (то есть для отложенного рендеринга или в качестве источника для некоторого алгоритма, который работает со значениями глубины). В этом случае оборудование должно гарантировать, что значения глубины сохраняются в кадровом буфере для вашего использования.
Отложенный рендеринг на основе плиток - как ясно видно из названия - работает на основе плиток за плиткой. Каждая часть экрана загружается во внутренние кэши, обрабатывается и снова записывается. Аппаратное обеспечение берет список треугольников, перекрывающих текущую плитку и текущие значения глубины, и из них приходит новый набор цветов и глубин, а затем записывает их снова. Таким образом, в то время как полностью тупой графический процессор может выполнять одно чтение и одну запись в каждое соответствующее значение буфера глубины для каждого треугольника, PowerVR будет выполнять одно чтение и одну запись на пакет геометрии, а остальное между ними выполняет алгоритм в стиле лучевого приведения.
На самом деле невозможно реализовать OpenGL на "чистом" отложенном рендерере на основе плиток, потому что буфер глубины должен быть читаемым. Также обычно неэффективно делать запись в буфер глубины только потому, что буфер цвета доступен для чтения в любое время (либо через glReadPixels
или неявно, в зависимости от того, когда вы представляете буфер кадра в соответствии с механизмами вашей ОС), то есть аппаратному оборудованию может потребоваться нарисовать сцену, а затем нарисовать на ней больше.
PowerVR использует буфер глубины, но не так, как обычный графический процессор (рендеринг в непосредственном режиме)
Различающаяся часть различного рендеринга на основе плиток означает, что треугольники для заданной сцены сначала обрабатываются (закрашены, преобразованы обрезаны и т. Д.) И сохраняются в промежуточном буфере. Только после обработки всей сцены плитки визуализируются одна за другой.
Наличие всех обработанных треугольников в одном буфере позволяет оборудованию выполнять удаление скрытой поверхности - удаление треугольников, которые в конечном итоге будут скрыты / перекрыты другими треугольниками. Это значительно уменьшает количество визуализированных треугольников, что приводит к повышению производительности и снижению энергопотребления.
Удаление скрытой поверхности обычно использует то, что называется буфером табуляции, а также буфер глубины. (Обе являются небольшими воспоминаниями на чипе, поскольку они хранят плитку за раз)
Не уверен, почему вы говорите, что PowerVR не использует буфер глубины. Я предполагаю, что это всего лишь "маркетинговый" способ сказать, что нет необходимости выполнять дорогостоящие операции записи и чтения из системной памяти для выполнения проверки глубины.
п.с.
Просто добавлю к ответу Томми: основными преимуществами различного рендеринга на основе плиток являются:
- Поскольку фрагменты обрабатываются фрагментом одновременно, все считывание и запись в буфер цвета / глубины / трафарета выполняются из быстрой встроенной памяти. В то время как цветовой буфер по-прежнему должен считываться / записываться в системную память на каждый фрагмент, во многих случаях буферы глубины и трафарета должны записываться в системную память только в том случае, если это требуется для последующего использования (например, в вашем случае пользователя). Трафик системной памяти является значительным источником энергопотребления... так что вы можете видеть, как он снижает энергопотребление.
- Дифференцированный рендеринг позволяет удалять скрытые поверхности. Меньше визуализированных треугольников означает меньше обработки фрагментов, значит меньше доступа к текстурной памяти.