Мне интересно, почему t из 4D-пространства может получить хороший результат интерполяции в свойствах 3D-вершин?
Потому что так работает математика. Или более того, вот как работает математическая математика .
Не углубляясь в математику, linear transformation является преобразованием между двумя пространствами, которое сохраняет линейную природу исходного пространства. Например, две линейки, параллельные друг другу, останутся параллельными после линейного преобразования. Если вы выполняете масштаб 2x в направлении Y, новые линии будут длиннее и дальше от начала координат. Но они все равно будут параллельными.
Скажем, у нас есть линия AB, и вы определяете точку C, которая является срединной точкой между A и B. Если вы выполняете такое же линейное преобразование на A, B и C, то новая точка C будет все еще будет на линии A B . Мало того, C все равно будет средней точкой новой линии.
Мы можем даже обобщить это. C может быть любой точкой, которая соответствует следующим уравнениям: C = (B-A)t + A
, для любых t
. Линейное преобразование A, B и C не повлияет на изменение t
в этом уравнении.
Фактически это то, что на самом деле означает линейное преобразование: это преобразование, которое сохраняет в этом уравнении t
для всех точек A, B и C в исходном пространстве.
Тот факт, что у вас есть 4 измерения в вашем пространстве, в конечном счете не имеет отношения к векторному уравнению выше. Линейные преобразования в любом пространстве сохранят t
. Матричное преобразование представляет собой линейное преобразование из одного пространства в другое (обычно).
Кроме того, ваши исходные 3D-позиции были действительно 4D-позициями, а W предполагалось равным 1.0.
Помните, однако, что преобразование из клип-пространства (4D однородное) в normalized-device-coordinate space (3D неоднородное) является нелинейным. Разделение по W не является линейным преобразованием. Это одна из причин, почему вы выполняете обрезание в 4D однородном пространстве клипов, где мы по-прежнему сохраняем линейную зависимость между исходными позициями и клипом.
Это также объясняет, почему perspective-correct interpolation of per-vertex outputs важно: потому что пространство вы делаете вашу растеризацию в (пространстве окна) является не линейного преобразованием исходного пространства вывода с помощью вершинных шейдеров (клип пространства). Это означает, что t
не сохраняется должным образом. При интерполяции вы обычно должны компенсировать это, чтобы поддерживать линейные отношения ваших значений вершин.
«* Я изучаю программируемый конвейер рендеринга, реализуя крошечный программный рендерер. *« Это не очень эффективный способ узнать это. –
@NicolBolas Ха-ха точно, но я шел вот так в течение двух недель (репозиторий https://github.com/stanleytangerror/TinyRenderer), встретил несколько проблем. Кстати, что бы вы порекомендовали для меня, чтобы разблокировать дерево умения 3D-программирования, у меня есть несколько примеров кодирования OpenGL 3.3? – stanleyerror