перспективная коррекция координат текстуры в 3D

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

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

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

  3. для коррекции перспективы я использую интерполяцию корректной перспективы: (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)
с = (ш / ш) / (1 / ш)

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

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

image showing incorrect perspective correction

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

11
задан James Edge 25 March 2011 в 20:13
поделиться