2012-05-31 4 views
6

В моем previous question было установлено, что при текстурировании квадрата лицо разбивается на треугольники и текстурные координаты, интерполированные аффинным образом.Линейное/нелинейное отображение текстур искаженного квадрата

К сожалению, я не знаю, как это исправить. Полезен provided link, но он не дает желаемого эффекта. Автор заключает: «Обратите внимание, что изображение выглядит так, будто это длинный прямоугольный квадрат, простирающийся на расстояние ... Это может стать довольно запутанным ... из-за« ложного восприятия глубины », которое это производит».

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

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

Вопрос в том, возможно ли это в фиксированной функции трубопровод? Я даже не уверен, что именно «правильный ответ» для более общих квадов; Я полагаю, что интерполяционные функции могут очень быстро усложниться, и я понимаю, что «сохранить исходное масштабирование» - это не совсем алгоритм. Треугольники пространства мира больше не являются линейными в пространстве текстур.

Как и в сторону, я не действительно понять 3 и 4-й координаты текстуры; если кто-то может указать мне на ресурс, это было бы здорово.

ответ

0

Ничего себе, это довольно сложная проблема. В основном вы не привносите перспективу в уравнение. Ваша окончательная координата x, y делится на значение z, которое вы получаете при повороте. Это означает, что вы получаете меньше изменений в пространстве текстур (s, t), чем дальше вы получаете от камеры.

Однако, делая это, вы эффективно интерполируете линейно по мере увеличения z. Я написал ANCIENT demo, который сделал это еще в 1997 году. Это называется «аффинным» отображением текстур.

Дело в том, что вы делите x и y на z, вам действительно нужно интерполировать ваши значения с помощью «1/z». Это правильно учитывает перспективу, которая применяется (когда вы делите x & y) на z. Следовательно, вы получаете "perspective correct" texture mapping.

Мне жаль, что я не могу вдаваться в подробности, кроме этого, но за последние 15 с лишним лет злоупотребления алкоголем моя память немного туманна;) На днях мне бы хотелось снова посетить программный рендеринг, m убежден, что с подобным открытием OpenCL это скоро станет лучшим способом написать движок рендеринга!

В любом случае, надеюсь, что это поможет и извиниться, я не могу больше помочь.

(В стороне от того, что я выяснил все, что получилось 15 лет назад, я любил иметь все доступные мне ресурсы, Интернет облегчает мою работу и жизнь. Принципы были невероятно болезненными. Я помню, как изначально пыталась выполнить интерполяцию 1/z, но она уменьшалась по мере приближения, и я отказался от нее, когда я должен был перевернуть вещи ... по сей день, поскольку мои знания увеличились экспоненциально, i STILL действительно хочу, чтобы я написал «медленный», но полностью перспективный правильный рендеринг ...в один прекрасный день я подхожу к нему;))

Удачи!

1

Лучший подход к решению работы с современными ГПА-API, можно найти на блоге Nathan Рида

http://www.reedbeta.com/blog/2012/05/26/quadrilateral-interpolation-part-1/

Но вы в конечном итоге с проблемой аналогична исходной задачи с точки зрения :(Я попробуйте решить эту проблему и опубликуйте решение после его получения.

Смежные вопросы