Текстурная роспись на 3D модели
Я знаю, что здесь уже есть пара подобных вопросов, но ответы на самом деле не помогают с тем, чего я пытаюсь достичь. Как следует из заголовка, я хочу проецировать текстуру на 3D-модель (точнее, на текстуру с UV-отображением) в OpenGL. Лучший пример этого был показан в этом видео - https://www.youtube.com/watch?v=pT4bx4J4NQQ
В комментариях автор упоминает, что он "проецирует каждый пиксель пистолета, что кисть возвращается в ультрафиолетовое пространство, и обновляет исходную текстуру". Я предполагаю, что он делает это путем рендеринга дополнительного прохода ультрафиолета, который позволяет ему заменить видимые пиксели пикселями текстуры кисти. Как обычно, легче сказать, чем сделать: основная проблема заключается в том, что когда мы уменьшаем масштаб от нашей модели и начинаем проецировать, не все ультрафиолетовые лучи модели будут видны в пространстве экрана, и поэтому при увеличении масштаба должны появиться "дыры" (где модель Ультрафиолетовые лучи были слишком малы для отображения на экране).
Поэтому мой вопрос - как я могу избежать этих дыр при рисовании на расстоянии? Проекционное отображение здесь не является ответом, потому что оно затронет все грани кисти, даже те, которые находятся за видимой поверхностью. Суперсэмплинг тоже не справится с экстремальными ситуациями и будет медленным как ад.
Я также сомневаюсь, что он просматривает все пиксели текстуры модели, чтобы определить, расположены ли они ниже кисти, так как увеличение ее размера или создание мазков значительно замедлит процесс.
1 ответ
Вероятно, разработчик программы, показанной в видео, рисовал модель в дополнительном закадровом проходе с текстурными координатами ST в закадровом проходе. Несколько лет назад появился способ "выбирать" объекты, используя специальный режим рендеринга (режим выделения) - не используйте его, он очень медленный и неэффективный. Но один из важных этапов выбора режима выбора заключается в том, что специальная матрица "выбора" умножается поверх матриц проекции и просмотра модели, которая как бы "масштабирует" объем преобразования до того, что находится ниже прямоугольника выбора. Если вы объедините это дополнительное преобразование с рендерингом ST-координаты, перейдите в буфер с достаточно высоким разрешением (назовите это буфером геометрии текстуры).
Теперь самое сложное: помните, что текстурирование - это фактически отображение из пространства ST в proj(представление модели (XYZW)) (отсюда и термин отображение текстуры). То, что вы действительно хотите, это обратное отображение. И если вас не волнует локальная кривизна, вы можете сделать это, просто поменяв координаты, переданные на ваш "картографический" компьютер. Так что, если вы поместите proj(viewview модели (XYZW)) туда, куда будет идти ST, и наоборот, это даст вам обратное отображение. Сделайте это с вашей переводной картинкой в качестве текстуры и буфером геометрии текстуры, вы изменили отображение текстуры и рисуете переводную картинку в текстурное пространство вашей модели. Поэтому установите текстуру вашей модели в качестве цветовой привязки для FBO, в котором вы делаете перевернутый рисунок, и используйте декаль в качестве текстуры для рисования, и все готово.
Поэтому мой вопрос - как я могу избежать этих дыр при рисовании на расстоянии?
Путем интерполяции по нему. И это происходит бесплатно, если ваши промежуточные буферы имеют достаточно высокое разрешение. Обратите внимание, что я не являюсь автором программы, показанной в видео, которое вы указали. Но однажды я написал такую программу, хотя и потерял ее источники. Это не так уж сложно сделать, и вы обычно можете найти такую функцию в каждом крупном пакете трехмерного моделирования. Существует мало смысла в том, чтобы иметь грубую техническую демонстрацию, если есть подходящие инструменты.