Я пишу программный рендерер, который в настоящее время работает хорошо, но я ' m пытается получить перспективную коррекцию координат текстуры, и это кажется неправильным. Я использую ту же матричную математику, что и 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) с = (ш / ш) / (1 / ш)
Это должно исправить перспективу, и это немного помогает, но все же существует очевидная проблема перспективы. Я что-то упустил, возможно, проблемы с округлением (я использую числа с плавающей запятой для всех математических расчетов)?
Посмотрите на этом изображении ошибку в координатах текстуры, очевидную по диагонали, это результат деления по координатам глубины .
Кроме того, это обычно делается для координат текстуры ... необходимо ли это для других свойств (например, нормалей и т. Д.)?