коррекция перспективы текстурных координат в 3d - PullRequest
11 голосов
/ 24 марта 2011

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

  1. преобразуем вершины, используя матрицы модели и проекции, и преобразуем в координаты клипа.

  2. длякаждый пиксель в каждом треугольнике, вычислить барицентрические координаты для интерполяции свойств (цвет, координаты текстуры, нормали и т.вершина, 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)

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

Смотрите на этом изображении ошибку в текстурных координатах, видимую вдоль диагонали, это результат, сделавший делениепо координатам глубины.

image showing incorrect perspective correction

Кроме того, это обычно делается для координат текстуры ... это необходимо и для других свойств (например, нормалей и т. д.)?

Ответы [ 4 ]

2 голосов
/ 06 мая 2011

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

OpenGL автоматически применяет коррекцию перспективы к текстуре, которую вы визуализируете. Все, что вам нужно сделать, это умножить координаты вашей текстуры (UV - 0.0f-1.0f) на компонент Z (мировую космическую глубину вектора положения XYZ) каждого угла плоскости, и это "сбросит" коррекцию перспективы OpenGL .

Я недавно спросил и решил эту проблему. Дайте эту ссылку выстрел:

отображение текстуры трапеции с квадратной текстурой в OpenGL

Статья, которую я прочитал для устранения этой проблемы, называется "Навигация в статических средах с использованием упрощения и преобразования пространства изображений" - стр. 9, приложение A.

Надеюсь, это поможет!

кт

2 голосов
/ 25 марта 2011

Вы должны сообщить OpenGL, что вам необходимо скорректировать перспективу на пикселях с

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST)

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

2 голосов
/ 26 марта 2011

Единственное правильное преобразование из координат UV в плоскость 3D - это гомографическое преобразование.

http://en.wikipedia.org/wiki/Homography

Вы должны иметь его в какой-то момент в своих вычислениях.

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

1 голос
/ 25 марта 2011

Да, это похоже на вашу традиционную вмятину со сломанной перспективой.Ваш алгоритм выглядит правильно, поэтому я действительно не уверен, что может быть не так.Я бы проверил, что вы на самом деле используете недавно вычисленное значение позже, когда вы его рендерите?Это действительно похоже на то, что вы столкнулись с проблемой вычисления правильного значения в перспективе, а затем использовали базовое неоткорректированное значение для рендеринга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...