Хороший способ реализовать Z-буфер
В настоящее время я делаю свои первые опыты с 3D-проектированием и рендерингом. Итак, я использую löve lua (то есть, не лучшую платформу для 3D), и могу отлично отрисовать все полигоны (только треугольники). Поскольку сортировка таблицы полигонов по расстоянию до камеры является задачей, которая занимает больше всего времени, для этого я реализую z-буфер. Но я не совсем уверен, как это сделать. Я знаю принципы, но как мне узнать расстояние точки в треугольнике до положения камеры? Мое текущее решение звучит так:
translate edge points of the triangle to 2D points ->
create polygon of those ->
for every pixel in the polygon: ->
translate 2D point back to 3D vertex (somehow) ->
calculate distance of vertex to camera position ->
if distance is bigger than zbuffer entry, overwrite zbuffer entry and
set pixel to polygon color
Это звучит действительно неэффективно. Как я могу ускорить это? У кого-нибудь здесь есть лучший способ реализовать zbuffering?
1 ответ
Если вы собираетесь внедрить программный Z-буфер, вам не нужно сортировать полигоны, только те, которые имеют альфа-смешение и не могут быть включены в технику Z-буфера.
После того, как вы перевели вершины в пространство камеры ( используя расчеты матрицы вида), вы получите значения detph Z для каждой вершины, затем наступает растеризация полигона, которая в итоге даст вам глубину Z для каждого пикселя.
Сейчас время Z-теста каждый раз, когда вы пишете пиксель на экране; Если пиксель находится перед текущим пикселем, то пишите, иначе ничего не сделайте.
Замечания по производительности: -Помните, что вам не нужно сортировать полигоны при использовании Z-буфера. -Будьте осторожны, когда говорите "расстояние от вершины до положения камеры". НЕ производите вычисление расстояния, матричное преобразование даст вам нужные вам значения гораздо эффективнее.