Разрешение независимого кубического безьего рисунка на 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)
.
Существуют и другие проблемы с этим алгоритмом: часть вычисления переменной с плавающей точкой будет переполняться во время вычисления, поэтому вы должны быть осторожны и добавить нормализацию операций в свой код.