Проблемы отсечения в 4D однородном пространстве?

Я изучаю программируемый конвейер рендеринга, реализуя крошечный программный рендерер. Я пытаюсь реализовать это в «аппаратном» стиле. Однако я не знаком с конвейером графического процессора и столкнулся с некоторыми проблемами однородного отсечения.

Согласно этот поток, предположим, у нас есть две точки e0, e1 в трехмерной координате глаза, которые проецируются в h0(-70, -70, 118, 120), h1(-32, -99, -13, -11) в однородном пространстве отсечения 4D. Затем делаем интерполяцию в 4D однородном пространстве, отрезок h0-h1 отсекается плоскостью w = -x (z = -1 в NDC) в 4D точке h(t)=t*h1+(1-t)*h2, с t = 0.99. Без ограничения общности предположим, что у нас есть h0-h(0.99) часть (видимая для просмотра), подаваемая на стадию растеризации. Поэтому нам нужно сгенерировать соответствующие свойства вершины h(0.99) (такие же, как выходной формат вершинного шейдера). Мой вопрос заключается в том, как создать свойства этих новых вершин?

Обновление: я пытаюсь использовать t в качестве переменной интерполяции, чтобы получить свойства вершины h(t) и получить разумный результат. Мне интересно, почему t из 4D-пространства может получить хороший результат интерполяции в свойствах 3D-вершин?


person stanleyerror    schedule 30.05.2016    source источник
comment
Я изучаю программируемый конвейер рендеринга, реализуя крошечный программный рендерер. Это не очень эффективный способ изучения этого.   -  person Nicol Bolas    schedule 30.05.2016
comment
@NicolBolas Ха-ха, точно, но я иду по этому пути уже две недели (репозиторий github.com/stanleytangerror/TinyRenderer), столкнулся с рядом проблем. Кстати, что бы вы порекомендовали мне, чтобы разблокировать дерево навыков 3D-программирования, у меня есть небольшой опыт кодирования OpenGL 3.3?   -  person stanleyerror    schedule 30.05.2016


Ответы (1)


Мне интересно, почему 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
comment
В этом суть, большое спасибо. Раньше я рассматривал это пространство как трехмерное пространство с дополнительным коэффициентом масштабирования w, за исключением однородного четырехмерного пространства. Теперь я вижу, как это работает. Вы мне очень помогаете. - person stanleyerror; 30.05.2016