Эффективная реализация Z-буфера

В настоящее время я реализую свой собственный рендерер с использованием алгоритма Z-Buffer. После того, как я сделал необходимые вычисления (читай: мой Z-буфер заполнен правильными значениями), я использую SDL для раскрашивания необходимых пикселей. Я использую для этого HWSurface.

Мой вопрос в том, как я могу сделать это как можно быстрее? Под этим я подразумеваю сам рисунок, я могу оптимизировать свою структуру, свой алгоритм, я сделаю это позже, но я хочу быть уверенным, что сам рисунок будет максимально быстрым.

Поскольку у меня есть собственная реализация ZBuffer (а позже будут и другие алгоритмы), я не могу использовать OpenGL, так есть ли альтернативы?

Теперь я просто просматриваю все свои точки в z-буфере и рисую все пиксели, которые должны быть отрисованы, один за другим (и поскольку это z-буферизация, я должен это делать, верно?) и вызываю Метод DrawPixel. Что касается SDL, я блокирую свою поверхность перед прохождением z-буфера, отрисовываю все пиксели и разблокирую их после этого, насколько я знаю, это не может быть быстрее.

Какие-либо предложения?


person Kevin    schedule 22.01.2011    source источник
comment
Можете ли вы нарисовать это, обновив текстуру, а затем использовать opengl для рисования одного четырехугольника с текстурой?   -  person vmpstr    schedule 23.01.2011
comment
Я собираюсь проверить это, еще не уверен.   -  person Kevin    schedule 24.01.2011


Ответы (1)


Программные реализации невероятно медленные, то есть WARP рендерит Crysis на шестиядерном процессоре i7 со скоростью в десять раз меньше, чем у 8800GT. Вы не найдете никакой конкурентоспособной производительности в программно реализованном Z-буфере.

Z-буфер не является особенно сложным алгоритмом, и маловероятно, что вы найдете одну реализацию более эффективную, чем другая. Z-буферизация — это не то, что вы делаете во время растеризации, это то, что вы делаете во время рендеринга пикселей. Если глубина нового пикселя больше, чем текущее записанное значение, не визуализируйте пиксель дальше, например, не вычисляйте его цвет и т. д. Вы не рисуете z-буфер или что-то в этом роде. Это не похоже на сортировку, в которой вы можете выбрать наиболее эффективную сортировку для своего алгоритма — это больше похоже на умножение матриц, они почти все одинаковы.

person Puppy    schedule 23.01.2011
comment
Растеризация это рендеринг пикселей, и именно здесь вы обычно выполняете тестирование глубины. - person Peter Alexander; 23.01.2011
comment
Да, вы совершенно правы, я должен признать, что это не пойдёт быстрее. - person Kevin; 24.01.2011