ПрограммированиеFAQ

Производительность рендеринга, и шейдеров


Как известно есть 2 типа шейдеров в DX9 вершинный и пиксельный(фрагментный).
Скорость работы шейдеров(и также FFP) не постоянна. Производительность объекта, отрендеренного с вершинным шейдером зависит только от того, сколько вершин в этом объекте (то есть фактически постоянна). Но вершинный шейдр как правило влияет намного меньше на производительность, чем пиксельный.

Производительность пиксельного шейдера зависит линейно от того, сколько пикселов данного объекта отрендерено на экране: то есть если объект далеко от камеры, или не в области камеры, то пиксельный конвеер отдыхает) Но тут надо помнить, что для производительности необходимо рисовать непрозрачные объекты(!) front-to-back (и не забыть выключить ALPHABLENDING для них) - в идеальном случае фрагментный шейдр для одного пиксела выполнится только 1 раз. В случае несортировки, фрагментный шейдр будет выполняться для каждого слоя рендеринга объектов.

То-есть допустим стоит ваза, за ней тумбочка, за ней стена: если неотсортировано, то сначала нарисуются пикселы стены, затем тумбочки, затем вазы. А если отсортировать, и будет рисоваться ваза->тумбочка->стена, то при отрисовке стены в местах поверх вазы или тумбочки, уже нарисованные пикселы вазы не будут перерисовываться. Сортировка конечно не обязательна, но часто поднимает производительность, особенно при объёмистых пиксельных шейдерах в сцене (POM).

Для этих - же целей используется Early Z-pass(Early Z-culling) http://www.gamedev.ru/code/forum/?id=69378. Позволяет добиться того "идеала", но использует дополнительный проход геометрии.

31 декабря 2007