Мне интересно, почему t из 4D-пространства может получить хороший результат интерполяции в свойствах 3D-вершин?
Потому что так работает математика. Или, что более важно, так работает линейная математика.
Не слишком углубляясь в математику, скажем, что линейное преобразование — это преобразование между двумя пространствами, сохраняющее линейное характер исходного пространства. Например, две параллельные линии останутся параллельными после линейного преобразования. Если вы выполните 2-кратное масштабирование в направлении Y, новые линии будут длиннее и дальше от начала координат. Но они все равно будут параллельны.
Допустим, у нас есть линия AB, и вы определяете точку C, которая является средней точкой между A и B. Если вы выполните одно и то же линейное преобразование на A, B и C, новая точка C1 будет по-прежнему находиться на линии A1B1. Мало того, C1 по-прежнему будет средней точкой новой строки.
Мы можем даже обобщить это. C может быть любой точкой, которая соответствует следующему уравнению: C = (B-A)t + A
для любого t
. Линейное преобразование A, B и C не повлияет на изменение t
в этом уравнении.
Фактически именно это и означает линейное преобразование: это преобразование, которое сохраняет t
в этом уравнении для всех точек A, B и C в исходном пространстве.
Тот факт, что у вас есть 4 измерения в вашем пространстве, в конечном итоге не имеет отношения к приведенному выше векторному уравнению. Линейные преобразования в любом пространстве сохранят t
. Матричное преобразование представляет собой линейное преобразование из одного пространства в другое (обычно).
Кроме того, ваши исходные 3D-позиции на самом деле были 4D-позициями, а W предполагалось равным 1,0.
Однако имейте в виду, что преобразование из клип-пространства (однородного 4D) в нормализованную-координату-устройства пространство (трехмерное негомогенное) является нелинейным. Деление на W не является линейным преобразованием. Это одна из причин, по которой вы выполняете отсечение в однородном 4D-пространстве отсечения, где мы по-прежнему сохраняем линейную связь между исходными позициями и пространством отсечения.
Вот почему так важна интерполяция выходных данных каждой вершины с правильной перспективой: потому что пространство в котором вы выполняете растеризацию (пространство окна), не является линейным преобразованием исходного пространства, выводимого вершинным шейдером (пространство клипа). Это означает, что t
не сохранился должным образом. При интерполяции вам обычно нужно компенсировать это, чтобы сохранить линейные отношения ваших значений для каждой вершины.
person
Nicol Bolas
schedule
30.05.2016