Подтвердить что ты не робот

Совершенный алгоритм рендеринга треугольника?

Где я могу получить алгоритм для отображения заполненных треугольников? Edit3: Я не могу использовать OpenGL для его рендеринга. Для этого мне нужен алгоритм с пикселями.

Моя цель состоит в том, чтобы сделать правильный многоугольник из треугольников, поэтому, если я использую этот алгоритм заполнения треугольника, ребра из каждого треугольника не будут перекрываться (или создавать промежутки между ними), потому что тогда это приведет к ошибкам рендеринга, если я используйте, например, XOR для рендеринга пикселей.

Следовательно, качество рендеринга должно соответствовать рендерингу OpenGL, поэтому я должен был бы определить, например, круг с N-вершинами, и он будет выглядеть как круг с любым размером правильно; поэтому он не использует только целые координаты для рендеринга, как это делают некоторые алгоритмы заполнения треугольника.

Мне понадобилась бы возможность управлять заполнением треугольника: я мог бы добавить свою собственную логику о том, как будет отображаться каждый из отдельных пикселей. Поэтому мне нужен чистый код за рендерингом, чтобы иметь полный контроль над ним. Он должен быть достаточно эффективным, чтобы рисовать десятки тысяч треугольников, не дожидаясь больше секунды. (Я не уверен, насколько быстро это может быть в лучшем случае, но я надеюсь, что он не займет больше 10 секунд).

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

Если для этого нет свободных алгоритмов, где я могу научиться самостоятельно строить и насколько это было бы на самом деле? (me = math noob).

Я добавил тег OpenGL, так как это как-то связано с ним.

Edit2: Я попробовал этот алгоритм здесь: http://joshbeam.com/articles/triangle_rasterization/ Но он, кажется, немного сломан, здесь представляет собой круг с 64 треугольниками, выполненными с ним: enter image description here

Но если вы увеличите масштаб, вы увидите ошибки: enter image description here

Объяснение: 2 пикселя перекрываются с другими цветами треугольника, чего не должно быть! (или прозрачность или эффекты XOR и т.д. приведет к плохой рендеринга).

Похоже, что ошибки более заметны на небольших кругах. Это неприемлемо, если я хочу иметь эффект XOR для пикселей.

Что я могу сделать, чтобы исправить это, чтобы он полностью заполнил его без перекрывающихся пикселей или пробелов?

Edit4: Я заметил, что рендеринг очень маленьких кругов не очень хорош. Я понял, что это потому, что координаты действительно были преобразованы в целые числа. Как я могу рассматривать координаты как поплавки и сделать так, чтобы круг был точно и точно таким же, как в OpenGL? Вот пример того, насколько плохи маленькие круги:

enter image description here

Обратите внимание, насколько совершенен рендеринг OpenGL! Это то, чего я хочу достичь, без использования OpenGL. ПРИМЕЧАНИЕ: Я просто не хочу отображать идеальный круг, но любую форму многоугольника.

4b9b3361

Ответ 2

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

Ответ 3

Это делалось, создавая контур, а затем заполняя горизонтальные линии. См. Эту ссылку для получения более подробной информации - http://joshbeam.com/articles/triangle_rasterization/

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

Ответ 4

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

При выполнении работы с графической картой обычно получается такое поведение, применяя порядок рисования слева направо, а также позволяя тест z-buffer или тестирование, если пиксель когда-либо был нарисован. Поэтому, если пиксель с тем же значением z уже установлен, изменение пикселя не разрешено.

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

Всякий раз, когда вы рисуете две разные фигуры, и вы видите что-то подобное, вы можете либо исправить вашу модель (чтобы они делили все граничные вершины), идите для теста z-buffer или теста цвета.

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