Разрешение независимого кубического безьего рисунка на GPU (Blinn/Loop)

Основываясь на следующих ресурсах, я пытаюсь работать с независимым кубическим беззеркальным рендерингом на графическом процессоре:

Графы GPU 3 Глава 25

Curvy Blues

Независимая независимая кривая рендеринга с использованием программно-графического оборудования

Но, как указано на веб-сайте Curvy Blues, в документах на двух других сайтах есть ошибки. Curvy Blues говорит мне посмотреть на комментарии, но я, похоже, не могу найти эти комментарии. Другой форум где-то говорит мне то же самое, я не помню, что это за форум. Но определенно что-то мне не хватает.

Во всяком случае, я попытался восстановить то, что происходит, и я не понимаю той части, где дискриминант вычисляется из детерминант комбинации преобразованных координат.

Итак, у меня есть исходные координаты, я привязываю их к матрице 4x4, преобразую эту матрицу в M3-матрицу и получаю C-матрицу. Затем я создаю матрицы 3x3 из координат в C-матрице и вычисляю детерминанты, которые затем могут быть объединены для создания a, b и c квадратичного уравнения, которое поможет мне найти корни.

Проблема в том, что я делаю это точно так: дискриминант неверен. Я четко поставил координаты для серпантина (симметричного, но правильного серпентина), но он утверждает, что это острие. Когда я сам вычисляю его с помощью wxMaxima, получая 1-й и 2-й порядок, а затем вычисляя перекрестное произведение, упрощая квадратичное уравнение, дискриминант этого уравнения кажется правильным, когда я помещаю в те же координаты. Когда я заставляю код использовать свой собственный дискриминант, чтобы определить, является ли он змеевидным или нет, но я использую определители для вычисления дальнейших координатных координат k, l, m, результат также неверен. Поэтому я предполагаю, что в детерминантах должна быть ошибка.

Может ли кто-нибудь помочь мне получить это правильно?

Ответ 1

Думаю, мне удалось это решить. Результаты близки к совершенству (иногда инвертированные, но это, вероятно, другая проблема).

Вот где я поступил не так, и я надеюсь, что смогу помочь другим людям не тратить впустую все время, которое я потратил впустую на поиск этого.

Я основал свой код на документе blinn-phong. У меня были координаты b0, b1, b2, b3. Раньше я рассматривал их как 2D-координаты с w, но я изменил это представление, и это решило проблему. Просматривая их как 3D-координаты с z = 0 и делая их однородными 4D-координатами для преобразования (w = 1), решение пришло.

Вычисляя матрицу C: C = M3 * B, я получил эти новые координаты. При вычислении детерминант d0, d1, d2, d3, я использовал, чтобы взять координаты x, y из столбцов 0 и 1 в матрице C, а w - коэффициент из столбца 2. НЕПРАВИЛЬНО! Когда вы думаете об этом, координаты на самом деле представляют собой 3D-координаты, поэтому для w-факторов нужно взять столбец 3 и игнорировать столбец 2.

Это дало мне правильные детерминанты, в результате чего был дискриминант, который смог разобраться, какой тип кривой я обрабатывал.

Но будьте осторожны, то, что сделало мой поиск еще длиннее, было фактом, что я предположил, что, когда он явно змеевидный, результат дискриминанта всегда должен быть > 0 (серпантин). Но это не всегда так, когда у вас есть математически совершенный сепентин (координаты таковы, что среднее является точным средним), детерминант скажет, что это острие (детерминант = 0). Раньше я думал, что этот результат был неправильным, но это не так. Так что не обманывайтесь этим.

Ответ 2

В этой книге есть ошибка GPU Gem 3, и страница на сайте nVidia также имеет ошибку:

a3 = b2 * (b1 x b1)

На самом деле a3 = b2 * (b1 x b0).

Существуют и другие проблемы с этим алгоритмом: часть вычисления переменной с плавающей точкой будет переполняться во время вычисления, поэтому вы должны быть осторожны и добавить нормализацию операций в свой код.