Коррекция перспективы текстурных координат в 3d
Я пишу программный рендерер, который в настоящее время работает хорошо, но я пытаюсь получить перспективную коррекцию координат текстуры, и это, кажется, не правильно. Я использую все те же математические математике, что и opengl для моего рендерера. Чтобы растеризовать треугольник, я делаю следующее:
преобразовать вершины, используя матрицы моделей и проекций, и преобразовать их в координаты клипа.
для каждого пикселя в каждом треугольнике вычислите барицентрические координаты, чтобы интерполировать свойства (цвет, координаты текстуры, нормали и т. д.)
чтобы исправить перспективу, я использую перспективную корректную интерполяцию: (w - координата глубины вершины, c - координата текстуры вершины, b - барицентрический вес вершины)
1/w = b0*(1/w0) + b1*(1/w1) + b2*(1/w2) c/w = b0*(c0/w0) + b1*(c1/w1) + b2*(c2/w2) c = (c/w)/(1/w)
Это должно исправить перспективу, и это немного помогает, но есть еще очевидная проблема перспективы. Я что-то здесь упускаю, возможно, некоторые проблемы с округлением (я использую поплавки для всей математики)?
Смотрите на этом изображении ошибку в текстурных координатах, видимую вдоль диагонали, это результат, сделавший деление по координатам глубины.
Кроме того, это обычно делается для текстурных координат... это необходимо и для других свойств (например, нормалей и т. Д.)?
4 ответа
Я недавно взломал код по этому вопросу. Вы можете использовать гомографию, если вы планируете изменить текстуру в памяти до того, как назначить ее поверхности. Это вычислительно дорого и добавляет дополнительную зависимость к вашей программе. Есть хороший хак, который решит проблему для вас.
OpenGL автоматически применяет коррекцию перспективы к текстуре, которую вы визуализируете. Все, что вам нужно сделать, это умножить координаты вашей текстуры (UV - 0.0f-1.0f) на компонент Z (глубину мирового пространства вектора положения XYZ) каждого угла плоскости, и это "скинет" коррекцию перспективы OpenGL,
Я спросил и решил эту проблему недавно. Дайте эту ссылку выстрел:
отображение текстуры трапеции с квадратной текстурой в OpenGL
Прочитанная мной статья, в которой исправлена эта проблема, называется "Навигация в статических средах с использованием упрощения и преобразования пространства изображений" - стр. 9, приложение А.
Надеюсь это поможет!
Коннектикут
Единственное правильное преобразование из UV-координат в 3D-плоскость - это гомографическое преобразование.
http://en.wikipedia.org/wiki/Homography
Вы должны иметь это в какой-то момент в ваших вычислениях.
Чтобы найти его самостоятельно, вы можете написать проекцию любого пикселя текстуры (так же, как для вершины) и инвертировать их, чтобы получить координаты текстуры из экранных координат. Это придет в форме гомографического преобразования.
Вы должны сообщить OpenGL, что вам нужно исправить перспективу на пикселях с
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST)
То, что вы наблюдаете, является типичным искажением линейного наложения текстуры. На оборудовании, которое не способно к коррекции перспективы на пиксель (как, например, PS1), стандартное решение просто делится на более мелкие полигоны, чтобы сделать дефект менее заметным.
Да, это похоже на твою традиционную вмятину со сломанной перспективой. Ваш алгоритм выглядит правильно, поэтому я действительно не уверен, что может быть не так. Я бы проверил, что вы на самом деле используете недавно вычисленное значение позже, когда вы его рендерите? Это действительно похоже на то, что у вас возникли проблемы с вычислением правильного в перспективе значения, а затем вы использовали базовое неоткорректированное значение для рендеринга.