Рисование треугольника в 3D в буфер глубины

Я экспериментирую с трехмерной графикой, не полагаясь на какую-либо 3D-библиотеку, такую ​​как Java3D, OpenGL, DirectX и т. Д. У меня есть рабочий Z-буфер (он же "глубинный буфер"), но я не могу придумать способ рисования треугольника в этот буфер. (Каждый треугольник определяется тремя точками в 3D.)

Кто-нибудь может предоставить псевдокод для рисования треугольника в Z-буфер?

3 ответа

Ответ на ваш вопрос (как есть) включает сложные алгоритмы, и для полного ответа потребуется много глав. Я буду предоставлять только ключевые слова и ссылки.

Во-первых, вам необходимо спроецировать три трехмерные координаты (обычно называемые вершинами, вершинами для формы множественного числа) вашего треугольника в 2D-пространстве. Вы можете начать с этой статьи о 3D-проекции. Если вы не знакомы с векторными операциями, матричными преобразованиями, мировым пространством и пространством вида / камеры, имейте в виду, что до получения результатов может пройти долгий путь. Ортогональная или перспективная проекция, это ваш выбор (хотя я полагаю, вы хотите для перспективной проекции). Я только предоставил ссылку на статью в Википедии (реже она сломается в будущем), поэтому она в основном говорит о математических связях, стоящих за ней. Но с этими ключевыми словами вы сможете найти тысячи хороших статей на эту тему с исходным кодом.

После того как вы преобразовали (спроецировали) свои 3D-координаты в пространстве вида / камеры, ваши координаты X и Y являются координатами углов / вершин 2D-треугольника (предположим, вы решили, что X движется слева направо, Y движется сверху вниз, это довольно часто встречается). Затем вам нужно растеризовать этот треугольник в свой буфер (который в основном является 2D-растровым изображением). Вот статья о растеризации треугольника, которая научит вас (с C-подобным исходным кодом) популярным методам сделать это (хотя речь идет только о растеризации с постоянным цветом, принцип остается тем же).

Следующим шагом является то, что вместо записи постоянного цвета для всех пикселей вам нужно переменное значение глубины. Время использовать эти 3 значения Z в ваших проектируемых вершинах. Для каждой горизонтальной линии вам нужно найти глубину Z самых левых и самых правых пикселей (используя линейную интерполяцию от верхней вершины Z до нижней вершины Z, просто будьте осторожны, так как одна сторона, скорее всего, будет иметь верхнюю, среднюю и нижние вершины, так что здесь вы должны интерполировать сверху вниз, затем из середины вниз. Если вы разделили свой треугольник на две части, как описано в статье, вам не нужно об этом беспокоиться). Затем запишите все пиксели между ними, а также линейную интерполяцию левой и правой Z.

Вы уже можете что-то растеризовать в z-буфер? Вопрос в том, как растеризовать треугольник? В технических статьях Криса Хекера он посвящен растеризации. Это часть серии по картированию перспективных текстур, на которую все ссылались, когда людям приходилось писать свои собственные. Они невероятно тщательны, но на первый взгляд могут показаться сложными.

Если вы хотите визуализировать что-либо в 3D-пространстве в целом, попробуйте удалить термин "буфер глубины" из ваших поисков. Буфер глубины - это специальный буфер, который не обязательно должен использоваться для рисования базовых объектов в трехмерном пространстве (но он будет полезен для рисования объектов, которые взаимодействуют друг с другом).

В любом случае, это хорошая идея, чтобы ознакомиться с общей архитектурой систем, которые вы используете. Например, в DirectX есть документация и сводная информация о конвейере. Обычно взаимодействие с буфером глубины обрабатывается автоматически на основе флага (ов), которые вы устанавливаете в вызовах графической библиотеки или оболочки. Есть причины писать исключительно в буфер глубины, но это более продвинутые методы рендеринга и обычно для определенной цели.

Другие вопросы по тегам