как сделать обратное наложение текстуры из изображения текстуры x, y в трехмерное пространство?

Я использую WPF 3D, но думаю, что этот вопрос должен относиться к любому наложению трехмерной текстуры.

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

Я мог бы сделать это с помощью пиксельного шейдера, где шейдер окрашивает каждый пиксель в зависимости от его расстояния от центра пятна. Но предположим, что у меня нет доступа к пиксельным шейдерам (поскольку меня нет в WPF).

Итак, мне кажется, что я хочу динамически создать текстуру с круговым узором и текстурировать корову с ее помощью.

Вопрос в следующем: как я могу узнать, какой трехмерной координате в пространстве модели соответствует заданная координата xy на изображении текстуры?

То есть, предположим, что я уже текстурировал свою модель простой белой текстурой - я установил координаты текстуры, выполнил наложение текстуры, но еще не получил изображения текстуры. Итак, у меня есть это изображение размером 1000x1000 (или что-то еще) в пикселях, которое красиво накладывается на корову в соответствии с некоторыми хорошими координатами текстуры, которые были установлены на модели заранее. Я понимаю, что когда 3D-оборудование начинает рисовать заданный треугольник, оно использует координаты текстуры вершин треугольника, чтобы найти соответствующую треугольную область изображения, а затем интерполирует по поверхности треугольника, чтобы заполнить отображаемые пиксели модели с помощью цвета из этой треугольной области изображения.

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

Если бы у меня была такая функция, я мог бы раскрасить свое изображение карты текстуры так, чтобы все точки (в трехмерном пространстве) на определенном расстоянии от центральной точки круга на корове получали один цвет, а все точки за пределами этого расстояния получали бы другой. цвет, и я получу красивое четкое круглое пятно на корове, даже с относительно низкополигональной моделью. Звучит правильно?

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


person M Katz    schedule 28.04.2013    source источник
comment
Я не знаю стандартного подхода. Но что я, наверное, сделал бы, так это нарисовал UV-карту из текущего вида. Поэтому вместо того, чтобы рисовать реальный цвет, нарисуйте координаты текстуры. Затем вы можете нарисовать круг на визуализированном изображении, найти координаты текстуры и нарисовать соответствующие пиксели в текстуре. Я не так хорошо знаком с WPF 3D, но полагаю, что это довольно сложно реализовать, если у вас нет прямого доступа к DirectX.   -  person Nico Schertler    schedule 28.04.2013
comment
Так же, как и в стороне, когда у вас есть координаты, вам не нужно рисовать исходную текстуру, но вы также можете рисовать во вторую текстуру, которая в противном случае прозрачна, и накладывать ее на исходную текстуру в качестве второго слоя материала. .   -  person hbarck    schedule 28.04.2013
comment
У вас есть 2D-точка на текстуре, и вы хотите получить 3D-точку в пространстве, где отображается эта текстура. Но это невозможно - могут быть тысячи трехмерных точек, которые содержат эту точку текстуры. На все треугольники может быть нанесена одна и та же часть текстуры.   -  person Ivan Kuckir    schedule 02.06.2013
comment
Иван, вы правы, что в целом данная точка текстуры может отображаться на любое количество точек модели. В моем случае, однако, я работаю с хорошо подобранной текстурой, такой как обычная текстура, которую вы использовали бы при покрытии трехмерной головы лицом и волосами.   -  person M Katz    schedule 03.06.2013


Ответы (2)


Я в конечном итоге заставил это работать. Я прохожу каждую точку текстуры (1024 x 1024 точек). Используя координаты текстуры модели, я определяю, внутри какой грани полигона, если таковая имеется, находится данная точка u, v. Если это внутри грани, я получаю координаты модели для каждой точки на этой грани. Затем я выполняю барицентрическую интерполяцию, как описано здесь: http://paulbourke.net/texture_colour/interpolation/

То есть для каждой точки u, v на текстуре я использую проверку внутри многоугольника, чтобы определить, в каком квадрате она находится на листе 2D-текстуры, а затем использую интерполяцию для той же самой 2D-геометрии, что и описано в ссылке выше, но вместо интерполяции цветов или нормалей я интерполирую 3D-координаты.

Затем я могу использовать трехмерную координату, чтобы раскрасить точку на текстуре (например, чтобы раскрасить круглое пятно на корове в зависимости от того, насколько далеко в пространстве модели данная точка текстуры находится от центральной точки пятна). Затем я могу применить текстуру к модели, и она работает.

Опять же, похоже, что это должна быть стандартная процедура с именем ...

Одна из проблем заключается в том, что результат очень чувствителен к качеству текстурирования, установленному моделистом. Например, если относительно большой четырехугольник на корове соответствует небольшому четырехугольнику на изображении текстуры, просто недостаточно пикселей для работы, чтобы получить плавную кривую внутри этого четырехугольника модели после применения текстуры. Вы, конечно, можете использовать текстуру с более высоким разрешением, например 2048x2048, но тогда время цикла будет 4x.

person M Katz    schedule 03.06.2013
comment
Также возможно, что треугольники перекрываются в УФ-пространстве, в этом случае проблема не решается идеально. - person Joan Charmant; 17.04.2017

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

Вы можете использовать стандартный графический API для выполнения этой задачи вместо написания собственной реализации. Позволять:

  • Размер текстуры -> Размер G-буферов
  • UVs каждого треугольника сетки -> Позиции вершин vec3 (u, v, 0) входного каскада
  • Индексы каждого треугольника сетки -> Индексы входного каскада
  • Позиции (и нормали и т. Д.) Каждого треугольника меша -> Атрибуты этапа ввода

После этапа растеризации графического конвейера генерируются все фрагменты, лежащие в пределах треугольника UV, а предоставленные атрибуты автоматически интерполируются. Теперь вы можете делать все, что захотите, в пиксельном шейдере!

person yetsun    schedule 21.08.2019