Буферизация глубины и заполнение полигонов в Java


Мне было немного любопытно посмотреть, смогу ли я написать простой движок в Java2D для визуализации 3D-Куба. Моя попытка, к моему удивлению, до сих пор была успешной. Куб выглядит довольно хорошо до сих пор: Введите описание изображения здесь

Но, как вы можете видеть, мне серьезно не хватает глубинного тестирования. Однако я совершенно не понимаю, как я мог бы заниматься глубинным тестированием в Java2D. Из того, что я нашел, Вы можете сделать это, отрисовав каждый полигон в растровое изображение, а затем Протестировав каждый пиксель против каждого другого пикселя, который может конфликтовать с. Вот где я заблудился.

У меня есть необходимые значения глубины для каждой вершины полигонов, но у меня нет значений глубины для каждого пикселя. Это, вероятно, побочный эффект разрешения Java2D заполнить каждый полигон для меня, используя метод fillPolygon(Polygon p). Таким образом, это приводит меня к мысли, что я не могу выполнить тестирование глубины, если я рендерю свои полигоны с помощью fillPolygon(..) метод. Мой первый вопрос таков: могу ли я сделать z-буферизацию, все еще будучи ленивым и позволяя Java делать мой пиксель рисование?

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

2 2

2 ответа:

Учитывая треугольник (или любой полигон), вы наверняка можете вычислить значение z в любом месте пикселя, но я не думаю, что вы можете сказать функции java fillPolygon(Polygon p) Рисовать только полигональные пиксели, которые проходят тест глубины, если в вашей библиотеке нет функции, которая также принимает маску трафарета. Если нет, вам нужно закодировать свой собственный растеризатор. Эта старая статья представляет замечательный, но простой алгоритм растеризации, который подходит для современного параллельного оборудования.

Все зависит от того, о чем вы хотели бы узнать больше.

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