2016-05-30 4 views
1

Я изучаю программируемый конвейер рендеринга, реализуя крошечный программный рендерер. Я пытаюсь реализовать его в «аппаратном» стиле. Однако я не знаком с конвейером GPU и получил некоторые проблемы однородного отсечения.Проблемы отсечения в однородном пространстве 4D?

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

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

+0

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

+0

@NicolBolas Ха-ха точно, но я шел вот так в течение двух недель (репозиторий https://github.com/stanleytangerror/TinyRenderer), встретил несколько проблем. Кстати, что бы вы порекомендовали для меня, чтобы разблокировать дерево умения 3D-программирования, у меня есть несколько примеров кодирования OpenGL 3.3? – stanleyerror

ответ

1

Мне интересно, почему 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 не сохраняется должным образом. При интерполяции вы обычно должны компенсировать это, чтобы поддерживать линейные отношения ваших значений вершин.

+0

Вот и все, спасибо большое. Я использовал это пространство как трехмерное пространство с дополнительным масштабным коэффициентом w, за исключением 4D однородного пространства. Теперь я вижу, как это работает. Ты мне очень помог. – stanleyerror

 Смежные вопросы

  • Нет связанных вопросов^_^